gpt4 book ai didi

c# - 从 C# 执行 SQL 脚本并记录错误

转载 作者:太空狗 更新时间:2023-10-29 23:24:26 24 4
gpt4 key购买 nike

我正在尝试从 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
}
}

感谢任何帮助!

最佳答案

我认为你这里有两个问题:

首先,您调用接受字符串而非 StringCollection 的 ExecuteNonQuery 方法。我想这个方法不能识别用于分隔批处理语句的 GO。相反,方法的文档 ExecuteNonQuery接受 StringCollection 的状态表示 GO 已被识别

第二个问题是传递的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 标志。然后捕获并记录可能出现的异常。但这肯定会更慢。

关于c# - 从 C# 执行 SQL 脚本并记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14234402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com