SQL Server Compact 4.0 душит операторы INSERT

Я пытаюсь создать базу данных SQL Server Compact 4.0 в коде, и я хотел бы создать некоторые системные таблицы поиска и заполнить их значениями.

Поэтому у меня есть сценарий SQL в качестве встроенного ресурса в моем проекте, который выглядит следующим образом:

CREATE TABLE SomeType
(TypeID INT NOT NULL CONSTRAINT PK_SomeType PRIMARY KEY,
 TypeDesc NVARCHAR(50) NOT NULL
)
GO

INSERT INTO SomeType(TypeID, TypeDesc) VALUES(10, 'Text for value 10')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(20, 'Text for value 20')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(30, 'Text for value 30')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(40, 'Text for value 40')
INSERT INTO SomeType(TypeID, TypeDesc) VALUES(80, 'Text for value 80')
GO

У меня есть некоторый код для создания и инициализации базы данных SQL Server Compact, и он сводится к следующему:

 using (SqlCeEngine engine = new SqlCeEngine(connectionString))
 {
      engine.CreateDatabase();
      CreateInitialDatabaseObjects(connectionString);
 }

 private void CreateInitialDatabaseObjects(string connectionString)
 {
     using (SqlCeConnection conn = new SqlCeConnection(connectionString))
     {
         List<string> resourceNames = new List<string>(Assembly.GetAssembly(typeof(DatabaseInterface)).GetManifestResourceNames());
         resourceNames.Sort();

         List<string> scripts = new List<string>();

         foreach (string scriptName in resourceNames)
         {
             Stream dbScript = Assembly.GetAssembly(typeof(DatabaseInterface)).GetManifestResourceStream(scriptName);

             if (dbScript != null)
             {
                 string contents = new StreamReader(dbScript).ReadToEnd();

                 string[] splitContents = contents.Split(new string[] {"GO"}, StringSplitOptions.RemoveEmptyEntries);

                 foreach (string split in splitContents)
                 {
                     scripts.Add(split);
                 }
             }
         }

         SqlCeCommand cmd = new SqlCeCommand();
         cmd.Connection = conn;

         conn.Open();

         foreach (string script in scripts)
         {
             cmd.CommandText = script;
             cmd.ExecuteNonQuery();
         }

         conn.Close();
      }
  }

Таким образом, этот код в основном перечисляет все встроенные сценарии SQL и читает их, а затем разбивает это содержимое на GO Ключевое слово в подпрограммы, которые затем выполняются по очереди.

Работает нормально - по крайней мере, для CREATE TABLE заявления....

Но SQL Server Compact 4.0 душит несколько вставок.... Я пытался добавлять точки с запятой после каждого INSERT линия, не повезло - все еще задыхается.

Детали ошибки:

System.Data.SqlServerCe.SqlCeException не было обработано
Сообщение = Произошла ошибка при разборе запроса. [Номер строки токена = 4, смещение строки токена = 1, ошибка токена = ВСТАВКА]
Источник = поставщик данных SQL Server Compact ADO.NET
ErrorCode = -2147467259
HResult = -2147217900
NativeError = 25501

Когда я ставлю GO заявление между каждым INSERT Скажите, это работает - но если у меня есть таблицы, в которые нужно вставить сотни строк, это немного запутанно.....

Существуют ли какие-либо приемы / методы, позволяющие SQL Server Compact принимать и обрабатывать несколько операторов вставки в одном блоке операторов SQL?

1 ответ

Решение

Там нет волшебной уловки, только GO или подобное. Вы можете выполнять только одну инструкцию за один раз с SQL Server Compact. Мои инструменты могут генерировать для вас операторы SQL Compact из существующей базы данных, или вы можете использовать SqlCeBulkCopy для быстрой загрузки данных.

Другие вопросы по тегам