从 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
命名空间中的SqlConnection
和SqlCommand
。
一旦您通过SqlCommand
调用存储过程,您将能够捕获存储过程引发的异常,如果您需要,我们还会读取该过程的返回值。
【讨论】:
这个答案对使用 sqlcmd 的问题进行了说明。 Sqlcmd 有时是唯一的选项,例如客户提供加载了 GO 语句的脚本 - ADO.Net 无法处理这些。【参考方案2】:即使使用 Windows 身份验证,您仍然可以使用 SqlCommand
和 SqlConnection
来执行,并且您不必重新发明***来处理异常。
简单的连接配置和单个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 中检索数据