我正在尝试从C#Windows应用程序在数据库上执行脚本(.sql文件)。 SQL文件包含'GO'语句;这意味着我正在使用对象SMO。
我正在尝试继续出错以及记录任何错误,这可能会在数据库上执行脚本期间发生。有没有办法做到这一点?
这是我正在使用的代码:
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
ServerConnection svrConnection = new ServerConnection(sqlConnection);
Server server = new Server(svrConnection);
string script = File.ReadAllText("upgradeDatabase.sql");
try
{
server.ConnectionContext.ExecuteNonQuery(script, ExecutionTypes.ContinueOnError);
}
catch (Exception ex)
{
//handling and logging for the errors are done here
}
}
感谢任何帮助!
答案 0 :(得分:4)
我认为你有两个问题:
首先,调用接受字符串而不是StringCollection的ExecuteNonQuery方法。我想这个方法不能识别用于分离批处理语句的GO。相反,接受StringCollection的方法ExecuteNonQuery的文档声明GOes被识别
第二个问题是ExecutionTypes.ContinueOnError
已通过。在这种情况下,相同的文档声明如果出现故障,您将无法收到异常。
我认为最好的方法应该是将输入文本拆分为GO,然后构建StringCollection以传递给ExecuteNonQuery方法并检查返回的受影响行数组。 像这样(应该测试)
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
ServerConnection svrConnection = new ServerConnection(sqlConnection);
Server server = new Server(svrConnection);
string script = File.ReadAllText("upgradeDatabase.sql");
string[] singleCommand = Regex.Split(script, "^GO", RegexOptions.Multiline);
StringCollection scl = new StringCollection();
foreach(string t in singleCommand)
{
if(t.Trim().Length > 0) scl.Add(t.Trim());
}
try
{
int[] result = server.ConnectionContext.ExecuteNonQuery(scl, ExecutionTypes.ContinueOnError);
// Now check the result array to find any possible errors??
}
catch (Exception ex)
{
//handling and logging for the errors are done here
}
}
当然,另一种方法是执行每个单个语句并删除ContinueOnError
标志。然后捕获并记录可能的异常。但这肯定会慢一点。
答案 1 :(得分:0)
FileInfo file = new FileInfo("upgradeDatabase.sql");
string script = file.OpenText().ReadToEnd();
SqlConnection conn = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery(script);
答案 2 :(得分:0)
我真的很喜欢这个变体,它使用InfoMessage事件和处理程序:
using(SqlConnection sc = new SqlConnection(connStr))
{
sc.InfoMessage += new SqlInfoMessageEventHandler(sc_InfoMessage);
Server db = new Server(new ServerConnection(sc));
db.ConnectionContext.ExecuteNonQuery(commandFileText, ExecutionTypes.ContinueOnError);
}
您需要添加对以下内容的引用:
答案 3 :(得分:0)
我不是程序员(DBA),因此我不确定。 我认为以下内容可能会有所帮助
svrConnection.FireInfoMessageEventOnUserErrors = true;