3

我正在尝试在代码中创建一个 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 Data Provider
ErrorCode=-2147467259
HResult=-2147217900
NativeError=25501

当我GO在每个语句之间放置一个语句时INSERT,它可以工作 - 但是如果我有需要插入数百行的表,那会有点混乱......

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

4

1 回答 1

4

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

于 2011-10-09T13:17:37.047 回答