2012-02-15 13 views
13

Ho difficoltà a inviare un'istruzione SQL tramite un DbContext utilizzando context.Database.ExecuteSqlCommand().SqlException: Errore di sintassi vicino a "GO"

sto provando ad eseguire

CREATE TABLE Phones([Id] [uniqueidentifier] NOT NULL PRIMARY KEY, 
    [Number] [int],[PhoneTypeId] [int]) 
GO 
ALTER TABLE [dbo].[Phones] ADD CONSTRAINT [DF_Phones_Id] 
    DEFAULT (newid()) FOR [Id] 
GO 

questo viene a mancare con la stringa di errore

Incorrect syntax near the keyword 'ALTER'. 
Incorrect syntax near 'GO'. 

Tuttavia in esecuzione questa affermazione esatta in SSMS viene eseguito senza errori? Eventuali problemi che devo risolvere per quanto riguarda il vincolo predefinito attraverso DbContext. Ho riscontrato problemi con le persone che utilizzano i vincoli e che non hanno impostato IsDbGenerated su true. Non sono sicuro di come ciò si applicherebbe qui però.

risposta

27

GO non è una parte di SQL, quindi non può essere eseguito con ExecuteSqlCommand(). Pensa a GO come metodo per separare i batch quando usi Management Studio o gli strumenti da riga di comando. Invece, basta rimuovere le dichiarazioni GO e si dovrebbe andare bene. Se si verificano errori poiché è necessario eseguire i comandi in batch separati, è sufficiente chiamare ExecuteSqlCommand() una volta per ogni batch che si desidera eseguire.

4

Dave Markle mi ha battuto. In effetti, puoi cambiare "VAI" a any other string per separare i lotti.

Un'implementazione alternativa qui è utilizzare SMO anziché Entity Framework. C'è un metodo utile chiamato ExecuteNonQuery che penso renderà la tua vita molto più semplice. Here è un buon esempio di implementazione.

+0

Cioè true per SSMS, tuttavia, anche se si modifica il separatore di batch in SSMS, il codice sopra continuerà a soffocare sul 'GO'. –

+0

Una nota che voglio aggiungere. Se come me, spesso desideri una sorta di valore di ritorno dalle query che stai passando tramite SMO, tieni presente che ExecuteWithResults restituirà eccezioni quando viene eseguito nelle istruzioni GO e ALTER. L'ho scoperto poco fa, e ho finito per mettere solo un'opzione per ExecuteNonQuery sull'interfaccia utente che viene controllata al momento dell'esecuzione dello script. – CodeWarrior

0

Lo so, la necropostazione è cattiva amministrazione, ma potrebbe essere questo post a salvare il tempo di qualcuno. Come è stato detto nel post di Dave, GO non è una parte di SQL, in modo che possiamo creare poco soluzione per farlo funzionare

  var text = System.IO.File.ReadAllText("initialization.sql"); 
      var parts = text.Split(new string[] { "GO" }, System.StringSplitOptions.None); 
      foreach (var part in parts) { context.Database.ExecuteSqlCommand(part); } 

      context.SaveChanges(); 

In questo caso i comandi sarebbero stati suddivisi ed eseguiti senza problemi

Problemi correlati