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, токен с ошибкой = INSERT]
Source = SQL Server Compact Поставщик данных ADO.NET
ErrorCode = -2147467259
HResult = -2147217900
NativeError = 25501

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

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


person marc_s    schedule 09.10.2011    source источник


Ответы (1)


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

person ErikEJ    schedule 09.10.2011