SQL Server Compact 4.0对INSERT语句产生了阻塞

时间:2011-10-09 11:47:29

标签: sql-server-ce sql-server-ce-4 insert-statement

我正在尝试在代码中创建一个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未处理
  Message =解析查询时出错。 [令牌行号= 4,令牌行偏移= 1,令牌错误= INSERT]
  Source = SQL Server Compact ADO.NET数据提供者
  错误码= -2147467259
  的HResult = -2147217900
  NativeError = 25501

当我在每个GO语句之间放置INSERT语句时,它可以正常工作 - 但是如果我有需要插入数百行的表,那会有点麻烦...... < / p>

是否有任何技巧/方法使SQL Server Compact在单个SQL语句块中接受并处理多个插入语句?

1 个答案:

答案 0 :(得分:4)

没有魔术,只有GO或类似。您只能使用SQL Server Compact一次执行一条语句。我的工具可以从现有数据库中为您生成SQL Compact语句,或者您也可以使用SqlCeBulkCopy进行快速数据加载。