2010-08-10 13 views
2

J'essaie d'insérer des données dans SQL à partir d'Excel VBA. Les commandes SQL sont construites au cours du script VBA et incluent l'utilisation de certaines variables SQL. J'essaie de comprendre comment les transactions fonctionnent dans VBA, et si elles vont fonctionner avec ce que j'ai besoin de faire, j'ai le code ci-dessous qui va tester cela, mais cela ne fonctionne pas. Cela me donne toujours une erreur à propos de "Doit définir une variable scalaire @ nom" donc je suppose qu'il y a un problème ici avec la portée des données/transaction. Comment puis-je obtenir ce code simple pour fonctionner?Transactions VBA

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 
+0

Enfiler mon costume de capitaine évident ici. Avez-vous envisagé d'utiliser proc stocké? –

+0

@conrad Oui, malheureusement, le code SQL est généré dynamiquement et varie énormément à chaque utilisation. –

Répondre

3

vous devez exécuter tout cela dans 1 lot

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)") 

construit une chaîne, puis utilisez 1 cn.Execute

Mieux encore, utiliser des requêtes paramétrées pour se prémunir contre SQL injection

+0

C'est ce que je pensais devoir faire, j'essayais d'éviter de construire une chaîne géante si je pouvais (le script SQL réel sera beaucoup plus grand que cela) mais si ce n'est pas possible, alors je devrai le faire. –