2008-12-04 5 views
1

J'avais une instruction d'insertion paramétrée qui fonctionnait bien et j'avais besoin d'ajouter une instruction select et de tout mettre dans une transaction pour obtenir des données pour l'un des champs de l'insertion. Je ne suis pas sûr si j'ai rencontré une limitation avec ASP/ADO ou si j'ai juste quelque chose de syntaxiquement faux. Voici mon code:Paramètre Insertion instruction avec transaction renvoyant une erreur

set oSQLCommand = Server.CreateObject("ADODB.Command") 
with oSQLCommand 
    .ActiveConnection = conn 
    .CommandType = 1 
    .CommandText = "set nocount on " &_ 
       "begin transaction " &_ 
        "declare @docid integer " &_ 
        "begin " &_ 
        "set @docid = (SELECT MAX(id+1) AS docid FROM draft_main) " &_ 
        "INSERT INTO draft_details (id, main_id, blah) " &_ 
        "VALUES (?, @docid, ?)" &_ 
        "end " &_ 
       "commit" 
    .Parameters(0).value = c_id 
    .Parameters(1).value = "blah blah" 
    .execute 
end with 
set oSQLCommand = nothing 

Quand je lance ce code, je reçois ce message d'erreur qui est déclenché quand il tente de définir la valeur du paramètre (0)

 
    Microsoft OLE DB Provider for SQL Server (0x80004005) 
    Syntax error or access violation 

Toute idée de ce qui ne va pas?

J'ai beaucoup d'expérience avec ASP et SQL mais aucun avec des procédures stockées. Ce code est-il si douloureusement proche d'une procédure stockée que je devrais simplement le déplacer et l'appeler comme bon?

Merci.

Répondre

2

Essayez de mettre; après chaque déclaration individuelle. par exemple.

.CommandText = "set nocount on; " &_ 
       "begin transaction; " &_ 
        "declare @docid integer; " &_ 
        "begin " &_ 
        "set @docid = (SELECT MAX(id+1) AS docid FROM draft_main); " &_ 
        "INSERT INTO draft_details (id, main_id, blah) " &_ 
        "VALUES (?, @docid, ?);" &_ 
        "end ;" &_ 
       "commit;" 
+0

En outre, cela serait mieux comme un appel à un proc stocké. SQL embarqué est le mal :) –

+0

; est optionnel ici. – gbn

+0

À la réflexion, êtes-vous sûr? Il y a un tas de déclarations individuelles qui doivent être délimitées d'une manière ou d'une autre. Cela fait un moment que j'ai fait le classique ASP ou utilisé le 0Bject ADODB directement, mais j'aurais pensé qu'il fallait encore le délimiter. –

Questions connexes