Sql CE Inconsistente con múltiples declaraciones

dapper sql-server-ce

Pregunta

Durante mucho tiempo ha sido cierto que puede ejecutar varias sentencias con SQL CE . Y, de hecho, estoy usando SQL Server Compact Toolbox para hacer exactamente eso. Pero cuando tomo los mismos comandos de instrucción múltiple y los ejecuto desde Dapper ...

public const string SampleDml = @"
   INSERT INTO [Plugin](Name, TypeName) VALUES ('Blog','Shroom.Blog');
   GO
   INSERT INTO [ContentDef](PluginID, Name, Placement, IsStatic) VALUES(@@IDENTITY,'MyBlog','Layout:Left',1);
   GO
";

Entonces sigo recibiendo este error:

Hubo un error al analizar la consulta. [Número de línea del Token = 3, Offset de línea Token = 1, Token en error = IR]

La versión de la biblioteca de SQL CE que estoy usando es la versión 4.0.0.0 (versión runtime v2.0.50727). Estoy usando Dapper 1.12.0.0 (versión runtime v4.0.30319) y Dapper Extensions 1.3.2.0 (runtime v4.0.30319).

La biblioteca de SQL CE parece ser el tiempo de ejecución incorrecto, pero el instalador de la plataforma web dice que tengo la última (¿así que realmente es la última?). ¿Pensamientos?

Respuesta aceptada

En realidad, solo puede ejecutar una sola instrucción por lote con SQL Server Compact, todo lo que hago (soy el autor de SQL Server Compact Toolbox) es dividir la cadena por GO y newline.

Tengo un código como este:

        using (StringReader reader = new StringReader(script))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Equals("GO", StringComparison.OrdinalIgnoreCase))
                {
                    RunCommand(sb.ToString(), dataset);
                    sb.Remove(0, sb.Length);
                }
                else
                {
                    sb.Append(line);
                    sb.Append(Environment.NewLine);
                }
            }
        }

Respuesta popular

Creé una pequeña biblioteca para resolver este problema. Divide un solo comando en varios subcomandos (utilizando punto y coma (;) como un separador de instrucciones) y los ejecuta uno a uno.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué