SQL Server Compact 4.0 душит операторы INSERT - PullRequest
3 голосов
/ 09 октября 2011

Я пытаюсь создать базу данных 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 Ответ

4 голосов
/ 09 октября 2011

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

...