【问题标题】:VBA TransactionsVBA 事务
【发布时间】:2011-03-27 22:24:00
【问题描述】:

我正在尝试将一些数据从 Excel VBA 插入 SQL。 SQL 命令是在 VBA 脚本的过程中建立起来的,包括一些 SQL 变量的使用。

我正在尝试了解事务在 VBA 中是如何工作的,以及它们是否可以与我需要做的事情一起工作,我有下面的代码可以测试这一点,但它不起作用。它总是给我一个关于“必须定义标量变量@name”的错误,所以我认为数据/事务的范围存在问题。我怎样才能让这个简单的代码工作?

Const stADO As String = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
"Persist Security Info=False;" & _
"Initial Catalog=ImportTest;" & _
"Data Source=localhost\sqlexpress"  

Set cn = New ADODB.Connection

With cn
   .CursorLocation = adUseClient
   .Open stADO
   .CommandTimeout = 0     
End With

cn.BeginTrans
cn.Execute "set implicit_transactions off"
cn.Execute ("declare @name varchar(100)")    
cn.Execute ("set @name='name'")    
cn.Execute ("Insert into test (id,name) values (55,@name)")
cn.CommitTrans    

cn.Close
Set cn = Nothing

【问题讨论】:

  • 在这里穿上我的明显船长套装。您是否考虑过使用存储过程?
  • @conrad 是的,不幸的是 SQL 代码是动态生成的,每次使用都会有很大的不同。

标签: sql sql-server vba ado


【解决方案1】:

你需要分批执行所有这些

cn.Execute "set implicit_transactions off"
cn.Execute ("declare @name varchar(100)")
cn.Execute ("set @name='name'")
cn.Execute ("Insert into test (id,name) values (55,@name)")

建立一个字符串然后使用 1 cn.Execute

更好的是,使用参数化查询来防范SQL injection

【讨论】:

  • 这就是我认为我可能需要做的事情,如果可以的话,我试图避免构建一个巨大的字符串(实际的 SQL 脚本会比这大很多)但如果不可能,那么我必须这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2014-02-20
  • 1970-01-01
相关资源
最近更新 更多