【问题标题】:VBA Connection from Excel 2010 to SQL Server 2008从 Excel 2010 到 SQL Server 2008 的 VBA 连接
【发布时间】:2014-04-15 06:12:39
【问题描述】:

我对 SQL 和 VBA 很陌生,所以请原谅下面的代码可能包含的任何大胆。我正在使用用 Excel 的 VBA 编写的代码。最终,来自 excel 用户表单的数据将输入到我使用 SQL Server 2008 创建的 SQL 数据库中。现在,我只是试图打开与 SQL 数据库的连接并将硬编码值输入到数据库中。不幸的是,这比我预期的要困难得多。我尝试过几种不同的方式来处理连接字符串,但没有运气。当表单运行时,我没有收到任何错误,并且可以看到数据已添加到适当的 Excel 工作表中(但 SQL DB 中没有更改)。我可以在 SQL Server Management Studio 上看到数据库并从那里添加行,但我无法通过此代码向数据库添加行。 db 仅受 Windows 身份验证保护。任何帮助将不胜感激。

Sub ConnectSqlServer()
'********SPC DATABASE CONNECTION**********************
'write slurry information to database
'spc_date, mix_type, slurry_lot_num, mixer_num, shift, oper

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String

'Create connection string
sConnString = "Provider=sqloledb; Server=SERV; Database=db; Trusted_Connection=True;"

'Create the Connection and Recordset objects
Set oConn = New ADODB.Connection
Set rs = New ADODB.Recordset

'Open connection and execute
conn.Open sConnString
Set rs = conn.Execute("INSERT INTO TBL (col1, col2) VALUES ('val', 'val');")

'Clean up
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rs = Nothing

End Sub

【问题讨论】:

  • 你得到什么样的错误?请注意,insert 不会返回记录集。
  • 我没有收到任何错误消息,但是当我转到 SQL Server Managment Studio 并查看表时,我可以看到我尝试添加到表中的值没有被添加

标签: sql sql-server-2008 vba database-connection excel-2010


【解决方案1】:

插入数据时,不需要记录集对象,因为INSERT 语句不返回记录集。相反,请尝试使用命令对象。命令对象使您可以更好地控制 SQL 语句如何传递到服务器,它还为您提供了一种测试是否插入了任何记录的方法。

我还建议在每个模块的顶部设置Option Explicit,因为它会阻止您在变量方面犯错误(例如,您的代码中同时有connoConn,我不这样做'认为你不是故意的。

这是我对您的代码所做的修改。它未经测试,但我认为我做对了。如果它运行时没有任何错误,并且recordsAffected 返回 1,但服务器上仍然没有任何内容,那么我们将不得不进行更多的挖掘。

Sub ConnectSqlServer()
'********SPC DATABASE CONNECTION**********************
'write slurry information to database
'spc_date, mix_type, slurry_lot_num, mixer_num, shift, oper

Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim sConnString As String
Dim recordsAffected as Long

'Create connection string
sConnString = "Provider=sqloledb; Server=SERV; Database=db; Trusted_Connection=True;"

'Open connection and execute
conn.Open sConnString
With cmd
  .ActiveConnection = conn
  .CommandType = adCmdText
  .CommandText = "INSERT INTO TBL (col1, col2) VALUES ('val', 'val');"
  .Execute recordsAffected 'Includes a return parameter to capture the number of records affected
End With

Debug.Print recordsAffected 'Check whether any records were inserted

'Clean up
If CBool(conn.State And adStateOpen) Then conn.Close
Set cmd = Nothing
Set conn = Nothing

End Sub

【讨论】:

  • 感谢杰夫的回复。我尝试使用它而不是我的原始代码并且发生了同样的事情 - 我没有收到任何错误,但没有将行添加到数据库中。我的代码都在 Microsoft Visual Basic for Applications 中 - 你知道 recordsAffected 会在哪里打印出来吗? (抱歉响应缓慢 - 该网站正在维护中)
  • 在 Visual Basic 编辑器中,按 Ctrl+G 打开即时窗口。这就是 Debug.Print 吐出结果的地方。您可能必须再次运行它才能看到任何内容。让我知道出现了什么。
  • 明白了..再次感谢。再次运行它,立即窗口中没有打印任何内容
  • 您确定代码实际上正在运行吗?因为我非常希望您的原始代码返回错误。试试这个:把你的光标放在代码前面的某个地方,可能是conn.Open sConnString,然后按F9创建一个断点,然后再次运行。您的代码应该暂停执行并以黄色突出显示;然后,您可以按 F8 逐步完成该过程。这可能会告诉你出了什么问题,但我想知道断点是否会被击中。
  • 进步!起初你是对的,没有达到断点。我取出了 Sub 和 End Sub 并输入了将数据添加到 Excel 工作表的代码。一旦我这样做了,它就达到了断点。按下 F8 后,它能够运行我的 sConnString="...." 行,但在 conn.Open sConnString 我收到“无效的连接字符串属性”错误
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2011-10-28
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多