我正在尝试在代码中创建一个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语句块中接受并处理多个插入语句?
答案 0 :(得分:4)
没有魔术,只有GO或类似。您只能使用SQL Server Compact一次执行一条语句。我的工具可以从现有数据库中为您生成SQL Compact语句,或者您也可以使用SqlCeBulkCopy进行快速数据加载。