Долгое время было верно, что вы можете выполнять несколько операторов с SQL CE . И на самом деле я использую SQL Server Compact Toolbox, чтобы сделать именно это. Но когда я беру те же команды с несколькими операторами и выполняю их из 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
";
Затем я получаю эту ошибку:
Произошла ошибка при анализе запроса. [Номер линии токена = 3, смещение линии токена = 1, токен с ошибкой = GO]
Версия используемой библиотеки SQL CE - это версия 4.0.0.0 (версия исполнения v2.0.50727). Я использую Dapper 1.12.0.0 (версия исполнения v4.0.30319) и Dapper Extensions 1.3.2.0 (runtime v4.0.30319).
Библиотека SQL CE кажется неправильной во время выполнения, но установщик веб-платформы говорит, что у меня есть последняя (так что это действительно последняя?). Мысли?
Фактически вы можете выполнять только один оператор за пакет с SQL Server Compact, все, что я делаю (я являюсь автором SQL Server Compact Toolbox), разделяет строку на GO и новую строку.
У меня такой код:
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);
}
}
}
Я создал небольшую библиотеку для решения этой проблемы. Он разбивает одну команду на несколько подкоманд (используя semicolon (;) в качестве разделителя операторов) и выполняет их по одному.