从 C# 启动 sqlcmd 时如何检索错误?

Posted

技术标签:

【中文标题】从 C# 启动 sqlcmd 时如何检索错误?【英文标题】:How to retrieve error when launching sqlcmd from C#? 【发布时间】:2010-09-09 12:56:08 【问题描述】:

我需要从 C# 应用程序运行存储过程。

我使用以下代码来做到这一点:

Process sqlcmdCall = new Process();
sqlcmdCall.StartInfo.FileName = "sqlcmd.exe";
sqlcmdCall.StartInfo.Arguments = "-S localhost\\SQLEXPRESS -d some_db -Q \":EXIT(sp_test)\""
sqlcmdCall.Start();
sqlcmdCall.WaitForExit();

在调用完成后,从 sqlcmdCall 对象中,我目前得到的 ExitCode 为 -100 表示成功,1 表示失败(即缺少参数、存储的 proc 不存在等)。

如何自定义这些返回码?

H.

【问题讨论】:

【参考方案1】:

如果您尝试从 c# 调用存储过程,您可能希望使用 ADO.Net 而不是通过命令行调用 sqlcmd。查看System.Data.SqlClient 命名空间中的SqlConnectionSqlCommand

一旦您通过SqlCommand 调用存储过程,您将能够捕获存储过程引发的异常,如果您需要,我们还会读取该过程的返回值。

【讨论】:

这个答案对使用 sqlcmd 的问题进行了说明。 Sqlcmd 有时是唯一的选项,例如客户提供加载了 GO 语句的脚本 - ADO.Net 无法处理这些。【参考方案2】:

即使使用 Windows 身份验证,您仍然可以使用 SqlCommandSqlConnection 来执行,并且您不必重新发明***来处理异常。

简单的连接配置和单个SqlCommand 可以毫无问题地执行它。

【讨论】:

【参考方案3】:

我有一个小型 VB.Net 应用程序,可以执行类似的系统命令。为了捕获错误或成功条件,我定义了正则表达式以匹配命令的错误文本输出,然后捕获如下输出:

        myprocess.Start()
        procReader = myprocess.StandardOutput()

        While (Not procReader.EndOfStream)
           procLine = procReader.ReadLine()

           If (MatchesRegEx(errRegEx, procLine)) Then
              writeDebug("Error reg ex: [" + errorRegEx + "] has matched: [" + procLine + "] setting hasError to true.")

              Me.hasError = True
           End If

           writeLog(procLine)
        End While

        procReader.Close()

        myprocess.WaitForExit(CInt(waitTime))

这样我可以捕获特定的错误并记录命令的所有输出,以防遇到意外错误。

【讨论】:

以上是关于从 C# 启动 sqlcmd 时如何检索错误?的主要内容,如果未能解决你的问题,请参考以下文章

部署 DacPac 时如何在 SqlPackage.exe 中使用多个 SQLCMD 变量?

如何使用 json 从 sql server ASP.net 中检索数据

如何将日期从 C# 存储到 MS-Access 以及如何检索它?

如何使用 c# 从 pfx 文件中检索证书?

从 C# 应用程序检索 sql 图像时出错

如何在 C# 中直接执行 SQL 查询?