如果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语句,在
这一行不对
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();
}