我有一个包含多个工作表的Excel工作簿。第一个工作表具有用户的登录信息,并且有一个按钮用于上载AS400中与不同表对应的所有工作表。工作表名称与AS400表名称相同。
我有上传按钮的代码,如下所示:
代码:
Dim objConn As New ADODB.Connection, objRs As New ADODB.Recordset
Dim WS_Count As Integer
Dim I As Integer
Dim WS_Name As String
objConn.ConnectionString = "DSN=MYAS400;DRIVER=Client Access ODBC Driver (32-bit); " & _
"SYSTEM = <ip>; UID = <uname>;PWD = <pwd>"
objConn.Open
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 2 To WS_Count
WS_Name = ActiveWorkbook.Worksheets(I).Name
objConn.Execute "DELETE FROM MYAS400LIB. " & WS_Name & ""
objConn.Execute "INSERT INTO MYAS400LIB. " & WS_Name & " SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=" & ThisWorkbook.FullName & ";HDR=YES;IMEX=1', 'SELECT * FROM [" & WS_Name & "$]')"
Next I
objConn.Close
Set objConn = Nothing
End Sub
如何将每个工作表(带列标题)插入AS400?
答案 0 :(得分:1)
在没有深入了解实际编码整个事情的细节的情况下,您的代码示例的问题在于您无法将电子表格的选择SQL发送到AS / 400。 AS / 400无法查看您的电子表格,因此无法在单个SQL中加载数据。相反,您必须仔细阅读电子表格的所有行,并将这些记录一次一个地插入到AS / 400表中。参数化的SQL更可取。
这是需要执行的代码部分:
objConn.Execute "INSERT INTO MYAS400LIB. " & WS_Name & " SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=" & ThisWorkbook.FullName & ";HDR=YES;IMEX=1', 'SELECT * FROM [" & WS_Name & "$]')"
它无效。将其替换为通过工作簿中的行读取的循环。您可以使用Excel OLEDB集或逐行读取电子表格。在循环内部,对于每个读取的电子表格行,您必须编写一个INSERT INTO语句,通过ODBC执行到AS / 400.
答案 1 :(得分:0)
我会尝试使用iSeries Access中的.NET数据提供程序。打开记录集。为工作表中的每一行添加AddNew。更新记录集。关闭。
这应该一次性插入工作表中的所有记录,而不是一次插入一个。