如何通过 C# 运行实体设计器 DDL 脚本
本文关键字:DDL 脚本 实体 何通过 运行 | 更新日期: 2023-09-27 18:33:00
我尝试了几种方法通过 C# 运行我的模型优先实体设计器 SQL 文件,但没有成功。我有一个SQL文件,其中包含我加载和读取的所有代码。
下面是我的代码。它会在执行的每个命令上给出错误。请注意,我正在通过模型容器的连接属性检索连接,该属性的类型为 DbConnection
,但我不确定这是否与此有关。
C# 脚本:
var commandStrings = Regex.Split(Resources.DatabaseScript, "^''s*GO''s*$", RegexOptions.Multiline);
//container is my EDMX container.
container.Connection.Open();
var command = container.Connection.CreateCommand();
var transaction = container.Connection.BeginTransaction();
command.Connection = container.Connection;
command.Transaction = transaction;
foreach (string commandInput in commandStrings)
{
var commandString = commandInput;
if (commandString.Trim() != "")
{
Debug.Write("Executing SQL ... ");
try
{
command.CommandText = commandString;
command.Connection = container.Connection;
command.CommandType = CommandType.Text;
command.Prepare();
command.ExecuteNonQuery();
Debug.WriteLine("Success!");
}
catch (Exception exc)
{
Debug.WriteLine("Failed!");
Debug.WriteLine("Exception: " + exc.Message);
Debug.Write("Rolling back ... ");
try
{
transaction.Rollback();
Debug.WriteLine("Success!");
} catch(Exception exce)
{
Debug.WriteLine("Exception: " + exce.Message);
}
}
finally
{
Debug.WriteLine("SQL: " + commandString);
}
}
}
transaction.Commit();
container.Connection.Close();
收到的错误。我收到的一些错误如下:
错误 1:
IF OBJECT_ID(N'[dbo].[FK_UserStory]', 'F') IS NOT NULL
ALTER TABLE [dbo].[StorySet] DROP CONSTRAINT [FK_UserStory];
查询语法无效。标识符"OBJECT_ID"附近,第 1 行,第 4 列。
错误 2:
IF SCHEMA_ID(N'dbo') IS NULL EXECUTE(N'CREATE SCHEMA [dbo]');
查询语法无效。标识符"SCHEMA_ID"附近,第 1 行,第 4 列。
我不确定具体是什么问题,但是完成异常处理和事务控制的代码顺序有点奇怪,所以我在下面做了一些修改。让我知道这是否对您有任何影响。
var commandStrings = Regex.Split(
Resources.DatabaseScript,
"^''s*GO''s*$",
RegexOptions.Multiline | RegexOptions.Compiled);
// container is my EDMX container.
container.Connection.Open();
try
{
using (var transaction = container.Connection.BeginTransaction())
{
try
{
foreach (var commandInput in commandStrings.Where(commandInput => !string.IsNullOrWhiteSpace(commandInput)))
{
Debug.Write("Executing SQL ... ");
try
{
using (var command = container.Connection.CreateCommand())
{
command.Connection = container.Connection;
command.Transaction = transaction;
command.CommandText = commandInput;
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
Debug.WriteLine("Success!");
}
finally
{
Debug.WriteLine("SQL: " + commandInput);
}
}
transaction.Commit();
}
catch (Exception exc)
{
Debug.WriteLine("Failed!");
Debug.WriteLine("Exception: " + exc.Message);
Debug.Write("Rolling back ... ");
try
{
transaction.Rollback();
Debug.WriteLine("Success!");
}
catch (Exception exce)
{
Debug.WriteLine("Exception: " + exce.Message);
}
}
}
}
finally
{
container.Connection.Close();
}
}
我解决了这个问题。我的代码工作得很好。
但是我没有使用模型容器通过container.Connection
的连接,我不得不使用(container.Connection as EntityConnection).StoreConnection as SqlConnection
。