如果c# . net中有错误,我如何在事务回滚中运行SQL Server数据库中的.SQL文件

本文关键字:SQL 运行 数据库 文件 事务 Server 有错误 net 如果 | 更新日期: 2023-09-27 18:02:14

我一直在尝试让系统启动并运行,它将获得它在指定位置找到的每个.sql文件的内容,并将它们运行到数据库中。到目前为止,我已经一次又一次地遇到同样的错误:

异常信息:

数据库System不存在。请确保名称输入正确。

我的代码现在看起来像这样:

string ScriptsLocation = "E:''dashboard''Scripts";
Server MS_SQL = new Server(Server);
MS_SQL.ConnectionContext.LoginSecure = false;
MS_SQL.ConnectionContext.Login = "test";
MS_SQL.ConnectionContext.Password = "test";
MS_SQL.ConnectionContext.DatabaseName = "testDatabase";
string[] Scripts = System.IO.Directory.GetFiles(ScriptsLocation);
for (int i = 0; i < Scripts.Length; i++)
{
    ScriptFullName = Scripts[i];
    using (var ScriptText = new StreamReader(ScriptFullName))
    {
        string Query = ScriptText.ToString();
        using (SqlConnection Connection = new SqlConnection(MS_SQL.ConnectionContext.ConnectionString))
        {
            Connection.Open();
            SqlTransaction Transaction = Connection.BeginTransaction();
            SqlCommand Command = Connection.CreateCommand();
            Command.Transaction = Transaction;
            try
            {
                Command.CommandText = Query;
                Command.ExecuteNonQuery();
                Transaction.Commit();
            }
            catch (Exception ex)
            {
                Transaction.Rollback();
            }
        }
    }
}

我尝试了3/4种不同的方法,但我得到同样的错误。如果我查看我的连接对象,DatabaseName属性读取我指定的数据库名称,如果我查看我的命令对象,连接属性中的数据库名称读取指定的数据库名称,所以我不知道它从哪里获得数据库名称System

我正在使用的用户是系统管理员。我在网上找不到有这个问题的人。我一直在对SQL Server 2012和2008 R2进行测试。我正在测试的SQL脚本是一个简单的1行UPDATE语句,在

如果c# . net中有错误,我如何在事务回滚中运行SQL Server数据库中的.SQL文件

中没有USE语句

这一行不对

 string Query = ScriptText.ToString();

这里传递的不是文件的内容,而是类StreamReader的全名,即"System.IO"。StreamReader",这可能是奇怪的错误消息的来源,其中System被误解为数据库的名称,IO模式名称和StreamReader应该是存储过程的名称。

您需要读取文件的内容并将其传递给您的代码。

string Query = ScriptText.ReadToEnd();

但是我建议使用不同的方法来运行sql脚本。

SqlTransaction Transaction = null;
try
{
    using(SqlConnection conn = new SqlConnection(MS_SQL.ConnectionContext.ConnectionString))
    using(Server server = new Server(new ServerConnection(conn)))
    {
       conn.Open();
       using(Transaction = Connection.BeginTransaction())
       {
           string[] Scripts = System.IO.Directory.GetFiles(ScriptsLocation);
           for (int i = 0; i < Scripts.Length; i++)
              server.ConnectionContext.ExecuteNonQuery(Scripts[i]);
       }
       Transaction.Commit();
    }
}
catch(Exception ex)
{
    // Display error and rollback
    Transaction.Rollback();
}