1

我尝试了几种方法来通过 C# 运行我的 Model-First Entity Designer 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();

收到错误。我收到的一些错误如下:

错误一:

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 列。

4

2 回答 2

1

我不确定具体是什么问题,但是您的代码执行异常处理和事务控制的顺序有点奇怪,所以我在下面对其进行了一些修改。让我知道这是否对您有任何影响。

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();
}

}

于 2012-05-02T21:42:36.393 回答
0

我解决了这个问题。我的代码工作得很好。

container.Connection但是我不得不使用ModelContainer 的连接,而不是使用(container.Connection as EntityConnection).StoreConnection as SqlConnection.

于 2012-05-09T17:37:58.747 回答