4

您好,我正在尝试将 excel 表中的值复制到同一数据库中的新表中Select * INTO query

提取到 excel 的数据来自其他表,在编辑 excel 中的某些列后,我需要将 excel 表发送回 SQL 数据库并创建新表。

我的代码有问题,上面写着错误:

Run- time error '-2147217900 ' Automation Error

我正在使用VBA 宏将表值从 Excel导入和导出到SQL 。

这是我的代码

Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

'Assumes that you have Field1, Field2 and Field3 in columns A, B and C
'For this example we can assume that the data exists on Sheet1, with a header on row
'1 and data in rows 2-11
'Also assume that the fields are defined as character (e.g. varchar or char)
'Text values must be enclosed in apostrophes whereas numeric values should not.

'adoCN.Open

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

sSQL = "SELECT * INTO TestTable FROM Sheets(1)$"

***adoCN.Execute sSQL***

Next lRow

adoCN.Close

Set adoCN = Nothing


'On Error GoTo 0

行错误:adoCN.Execute sSQL

请帮帮我。

4

3 回答 3

1

简单地说,你不能这样做。

第一:SELECT * INTO TestTable

您只能运行此语句一次。您正在尝试为电子表格中的每一行创建同一个表格。

第二:.. FROM Sheets(1)$

我对 VBA 没有信心,但我想你期待 ADO.NET 有一些神奇的东西。

你需要:

  1. 在 FOR 之外创建表
  2. INSERT INTO 内部 FOR
于 2013-09-11T14:42:55.917 回答
1

我很确定错误是 SQL 无法识别“Sheets(1)$”。短语 i“sSQL”被发送到 adodb.connection,因此它不在 Excel 中处理(尽管从 Excel-VBA 调用)。因此,来自 Excel 的任何引用都必须已经作为字符串传递到那里,否则它们将导致错误。

我不会尝试一次将整个表放入 SQL 中,而是逐行执行此操作,因为如果您有任何数据问题(字符串为 Long,数据格式错误),整个表将被退回。

我会让它类似于http://www.vb-magazin.de/forums/forums/post/9581.aspx

(如果您需要任何帮助翻译此内容,请告诉我)

...有一个重要的区别:在每个“add.new”成功后,我会在 Excel 的相应行中添加一个备注,因此它肯定不会被第二次传输。为此,您将在 dbRecord.Update 行之后放置

xls_Appl.ActiveCell.Offset(I,6).Value = "send_to_sql"

当然,在每行的开头,在处理它之前,您需要检查此文本是否已经存在,如果是这种情况,请转到下一项。

我希望这对你有帮助,麦克斯

于 2013-09-09T14:00:36.750 回答
0

我可以看到该代码存在一些问题。

首先,您不能只通过 SQL 语句传递工作表的名称。SQL Server 甚至不知道您的工作表(或 Excel,就此而言)的存在。它们是完全独立的实例。

其次,正如有人已经指出的那样,每次运行"SELECT * INTO ..."语句时,实际上都是在创建一个只有一行的新表。

你应该做这样的事情。我假设(正如您在评论中所说)TestTable数据库中已经存在,并且您的工作表确实是Sheets(1). 此外,您还没有告诉哪一列具有哪种格式,所以我假设它们都是字符串,并在语句中的值周围加上引号。

Dim adoCN As ADODB.Connection
Dim sConnString As String
Dim sSQL As String
Dim lRow As Long, lCol As Long

sConnString = "Provider=sqloledb;Server=;Database=mycon;User Id=;Password="

Set adoCN = CreateObject("ADODB.Connection")

adoCN.Open sConnString

With Sheets(1)

For lRow = 1 To ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

  sSQL = "INSERT INTO TestTable VALUES ('" & .Cells(lRow, 1) & "', '" & .Cells(lRow, 2) & "', '" & .Cells(lRow, 3) & "')"

  adoCN.Execute sSQL

Next lRow

End With

adoCN.Close

Set adoCN = Nothing
于 2013-09-12T13:04:51.617 回答