2009-12-23 5 views
0

J'exécuter cette requêteQuel est le problème avec cette requête SQL?

"insert into students (StudentName) values ('reza');insert into Records (RecordValue,StudentID)" + 
      " values (20,@@IDENTITY)"; 

en C# et obtenir une exception près:

Characters found after end of SQL statement 
+1

Comment exécutez-vous la requête dans C#?Si vous l'exécutez dans ssms, obtenez-vous les résultats attendus? – Ray

+0

je le lance par oledbcommand –

+0

Si vous le divisez en deux exécutions de requêtes distinctes, obtenez-vous toujours la même erreur? –

Répondre

4

Je suppose que vous voulez récupérer l'identité de l'étudiant nouvellement inséré, puis l'insérer dans la table "Records", non?

Je suggère fortement que vous utilisez SCOPE_IDENTITY() au lieu de @@ IDENTITY qui a quelques problèmes si vous avez par exemple déclenche sur votre table. Pinal Dave a un great blog post à propos de ces problèmes.

De même, si vous appelez SQL Server à partir de C#, je vous recommande fortement d'utiliser le fournisseur SQL .NET natif (SqlConnection, SqlCommand, etc.) - et non oledbcommand.

Essayez cette

using (SqlConnection _con = new SqlConnection("server=(local);database=TEST;integrated security=SSPI;")) 
{ 
    string queryStmt = "INSERT INTO dbo.Students (StudentName) VALUES('reza'); " + 
         "INSERT INTO dbo.Records(RecordID, StudentID) VALUES (20, SCOPE_IDENTITY());"; 

    using (SqlCommand _cmd = new SqlCommand(queryStmt, _con)) 
    { 
     try 
     { 
      _con.Open(); 
      _cmd.ExecuteNonQuery(); 
      _con.Close(); 
     } 
     catch (Exception exc) 
     { 
      string msg = exc.Message; 
     } 
    } 
} 

Cela fonctionne certainement, je viens de tester avec succès dans mon cadre.

+0

Qu'en est-il de la base de données d'accès? –

+0

Vous ne pouvez pas exécuter plusieurs instructions lorsque vous utilisez Access. –

+0

+1 pour l'exemple de travail. – Bratch

0

Vous devez créer une procédure stockée qui contient les instructions SQL, puis exécutez la procédure stockée à partir de votre code C# .

+0

bien, il est souhaitable d'utiliser une procédure stockée, mais pas un MUST –

1

Je viens couru ce code et ça a:

SqlConnection cn = new SqlConnection("..."); 
SqlCommand cm = cn.CreateCommand(); 
cm.CommandText = 
    "INSERT INTO MyTable (FieldA) VALUES ('Sample'); " + 
    "INSERT INTO MyTable (FieldB) VALUES (@@Identity); "; 
cn.Open(); 
cm.ExecuteNonQuery(); 

Peut-être que vous avez besoin d'ajouter un espace après que le premier caractère de virgule.

1

Vous devez envelopper cette place dans une procédure stockée, car logiquement est une unité de travail - et vous pouvez l'appeler depuis plus d'un endroit aussi.

Je considère également sérieusement si vous devez envelopper les deux déclarations en une transaction - vous ne voudriez pas que l'insertion dans les étudiants qui suivent et dans les dossiers défaillants. OK c'est une condition de bord mais il est facile de se prémunir contre dans un SP et rend le code plus professionnel. Un autre avantage de l'utilisation d'un SP dans ce cas est que, comme vous actionnez déjà quelques insertions, il est tout à fait possible que vous souhaitiez l'étendre plus tard - insérer dans une table de finance par exemple. Si vous terminez dans un SP, vous pouvez simplement modifier le SP plutôt que d'avoir à coder le code pour toutes les occurrences d'un nouvel étudiant, à le modifier et à le recompiler.

+0

+1 quelques très bons points - la transaction est certainement quelque chose qui pourrait avoir beaucoup de sens, enveloppant dans un proc stocké, aussi, peut-être –

1

Vous pouvez faire cette commande beaucoup comme le montre - vous n'avez pas besoin d'avoir une variable temporaire ni avez-vous besoin d'un « GO » ou un espace après la virgule. Je suis d'accord avec Marc_s que vous devriez utiliser SCOPE_IDENTITY() pour éviter les problèmes avec d'autres transactions en plaçant une valeur.

La question est: pourquoi avez-vous des citations autour de votre déclaration et un point-virgule à la fin? Clairement vous tirez ceci du code et que est où je regarderai. Donc ... d'abord, exécutez cette commande dans SQL Server Management Studio ou similaire pour vérifier que cela fonctionne. Une fois que vous faites le vérifier (il devrait fonctionner en supposant que votre structure de table est ce que je pense qu'il est) alors Calculez ce que votre code fait mal.

Mise à jour: Je riais ici ma réponse est « corrigeait » beaucoup d'autres réponses qui sont en train de disparaître, il devient évident qu'ils ne sont pas bonnes.

+0

parce que j'ai une valeur de char dans ma table, j'utilise 'sample' –

Questions connexes