2009-03-25 6 views
2

a un problème avec des colonnes d'identité dans Sql Server CESql Server 3.5 Ce insert d'identité

lorsque vous utilisez l'explorateur de serveur, dans VS2008, exécuter le script suivant

SET IDENTITY_INSERT testTable ON; Insérer dans les valeurs testTable (id, name) (1, 'Quelque chose') SET IDENTITY_INSERT testTable ON;

envoie l'erreur de message suivant 'La construction ou l'instruction SQL définie n'est pas prise en charge.' mais insère alors la ligne bien?!?!?!

De toute façon, lorsque je tente de faire la même chose à C#, donnant ce script comme un texte de commande il ne dit l'erreur était dans le « Insérer le mot clé »

Je comprends que contre SQL Server CE du commande seulement accepte une commande par lots au moment alors dans ce cas, nous avons trois commandes (cela fonctionnerait avec le SQLServer complet) une idée?

+0

pourrait-il être le ";" entre "INSERT" et deuxième "SET"? –

Répondre

2

ESSAYEZ

SET IDENTITY_INSERT testTable ON; 
Insert into testTable (id,name) values (1,'Something'); 
SET IDENTITY_INSERT testTable OFF; 

OU

SET IDENTITY_INSERT testTable ON 
go 
Insert into testTable (id,name) values (1,'Something') 
go 
SET IDENTITY_INSERT testTable OFF 
go 
+1

GO est un concept qui n'existe que dans les outils - l'analyseur réel ne les utilise pas pour distinguer quoi que ce soit. –

+0

@Jason Short, vous avez tort! faites ce qui suit: imprimez 'ERROR !!!' créer la procédure xyz en tant que Print 'ceci ne fonctionnera pas sans "GO". en ajoutant GO après l'impression 'ERROR !!!', cela fonctionnera –

+0

@KM: SQLCE ne supporte pas les procédures stockées de toute façon –

9

Si vous utilisez 3.5 SQLCE alors cela devrait fonctionner. Cependant, vous devez l'envoyer en deux commandes distinctes. Vous ne pouvez pas séparer les commandes avec ";" ou "GO" dans SqlCe. Au contraire, vous devez faire quelque chose comme ceci:

  SqlCeConnection connection = new SqlCeConnection(connectionString); 
      SqlCeCommand identChangeCommand = connection.CreateCommand(); 
      identChange.CommandText = "SET IDENTITY_INSERT SomeTable ON"; 
      SqlCeCommand cmd = connection.CreateCommand(); 
      cmd.CommandText = "INSERT INTO testTable (Id, column1, column2..) VALUES (10,val1,val2...)"; 
      try 
      { 
       connection.Open(); 
       identChange.ExecuteNonQuery(); 
       cmd.ExecuteNonQuery(); 
      } 

      catch (SqlCeException ex) 
      { 
       //log ex 
      } 
      finally 
      { 
       connection.Close(); 
      } 
+0

ok, cela a très bien fonctionné. Merci beaucoup! J'essayais d'utiliser une commande separatelly, en insérant insert_identity dans ma winform et c'était bien mais je ne pouvais pas faire l'insertion après. Mais comme ton exemple fait exactement ce que je voulais =). à votre santé –

Questions connexes