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

时间:2020-03-05 18:56:09  来源:igfitidea点击:

我需要从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。

解决方案

回答

如果尝试从c调用存储过程,则需要使用ADO.Net,而不是通过命令行调用sqlcmd。查看System.Data.SqlClient名称空间中的SqlConnection和SqlCommand。

通过SqlCommand调用存储过程后,我们将能够捕获该存储过程引发的异常,并且如果需要的话,我们也会读取该过程的返回值。

回答

我有一个小型的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))

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

回答

即使使用Windows身份验证,我们仍然可以使用SqlCommand和SqlConnection来执行,并且不必重新发明轮子来进行异常处理。

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