3

我一直在到处寻找答案,但我将描述的问题没有成功。

我有一个经常手动更新的 Excel 工作表。我被要求以实时的方式将每一行更改推送到 Sql Server 中。我需要用户能够通过按下保存按钮将一行保存到服务器。

在 SSMS 中,我已经能够使用 OPENROWSET 从服务器读取数据,例如:

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=YES;Database=C:\tmp\test2.xlsm',
'SELECT * FROM [myrng]');

我还能够将数据从 Excel 插入到 SQL Server:

Insert into NEWDB.dbo.master 
Select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 
12.0;HDR=YES;Database=C:\tmp\test2.xlsm','SELECT * FROM [myrng]')

当我尝试在 Excel 文件仍打开的情况下将数据查询、插入或更新回服务器时,就会出现问题。

我最终打算做的是构建一个向导应用程序来填充一个 Excel 表,在该过程结束时可以将其提交到相应的 SQL Server 表。

到目前为止,我一直在玩 VBA 和 ADO,但没有成功,有人建议我使用 DTS 或 SSIS,但我需要 Excel 文件一直保持打开状态。

在此先感谢,罗德里戈。

4

1 回答 1

0

您可以针对与 Excel 的连接运行:

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

''Late binding, so no reference is needed

Set cn = CreateObject("ADODB.Connection")

cn.Open strCon

''A single value, but a query with parameters would be  better
ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;Trusted_Connection=Yes;DATABASE=Test].table_1 (Atext ) " _
& "Values ('" & Sheet1.[b3] & "')"

cn.Execute ssql

或者

ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;" _
    & "Trusted_Connection=Yes;DATABASE=Test].table_1 ( Atext ) " _
    & "SELECT ACol FROM [Sheet1$b7:c9]"

或者

ssql = "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=server;" _
    & "Trusted_Connection=Yes;DATABASE=Test].table_1 ( Atext ) " _
    & "SELECT Acol FROM Anamedrange"

如果 HDR=No,则使用 F1、F2 等作为各个列的名称,从范围中的第一列开始编号。

这在 Excel 中也适用于我,在此示例中,我使用了对 Microsoft ActiveX 数据对象 xx 库的引用,但后期绑定也可以正常工作。

Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
cn.Open servercon

cmd.ActiveConnection = cn

cmd.CommandText = "insert_user" ''Stored procedure
cmd.CommandType = adCmdStoredProc
cmd.Parameters("@username").Value = Worksheets("Sheet1").Cells(3, 2)
cmd.Execute
于 2013-02-13T21:27:58.513 回答