2012-02-15 12 views
13

Tengo problemas para enviar una instrucción SQL a través de un DbContext usando context.Database.ExecuteSqlCommand().SqlException: Error de sintaxis Cerca de 'IR'

Estoy tratando de ejecutar

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 

Esta falla con la cadena de error

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

Sin embargo corriendo esa declaración exacta en SSMS se ejecuta sin errores? Cualquier problema que deba resolver con respecto a la restricción predeterminada a través del DbContext. He visto problemas con personas que usan restricciones y que no tienen IsDbGenerated configurado en verdadero. No estoy seguro de cómo se aplicaría aquí sin embargo.

Respuesta

27

GO no es parte de SQL, por lo que no se puede ejecutar con ExecuteSqlCommand(). Piense en GO como una forma de separar lotes cuando utiliza Management Studio o las herramientas de línea de comandos. En cambio, simplemente elimine las declaraciones de GO y debería estar bien. Si encuentra errores porque necesita ejecutar los comandos en lotes separados, simplemente llame a ExecuteSqlCommand() una vez por cada lote que desee ejecutar.

4

Dave Markle me ganó. De hecho, puede cambiar "IR" al any other string para separar lotes.

Una implementación alternativa aquí es usar SMO en lugar de Entity Framework. Hay un método útil llamado ExecuteNonQuery que creo que hará su vida mucho más simple. Here es un buen ejemplo de implementación.

+0

Es decir cierto para SSMS; sin embargo, incluso si cambia el separador de lotes en SSMS, el código anterior todavía se ahogará en el 'GO '. –

+0

Una nota que quiero agregar. Si, como yo, a menudo quiere algún tipo de valor de retorno de sus consultas que está pasando a través de SMO, tenga en cuenta que ExecuteWithResults devolverá excepciones cuando se encuentre con las sentencias GO y ALTER. Descubrí esto hace un momento y terminé simplemente poniendo una opción en ExecuteNonQuery en nuestra UI que se verifica en el tiempo de ejecución del script. – CodeWarrior

0

Lo sé, necroposting es malo maner, pero puede ser que esta publicación le ahorre tiempo a alguien. Como se mencionó en el post de Dave, GO no es una parte de SQL, por lo que puede crear poca solución para hacer que funcione

  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(); 

En este caso, los comandos serían partido y ejecutados sin problemas

Cuestiones relacionadas