C# 如何查看SQL查询是否正确执行且没有错误?

C# 如何查看SQL查询是否正确执行且没有错误?,c#,sql-server,C#,Sql Server,我正在创建一个分离数据库的程序 如何检查存储过程是否已无错误运行,以便向用户确认存储过程已完全完成 我在执行过程中使用了try catch,但我不能100%确定这会返回所有内部错误 我担心的是,如果我写: try { cmd.ExecuteNonQuery(); MessageBox.Show("it has finished"); } catch (exception ex) { ex.ToString(); } 不可靠 我的命令: return "sp_detach_db

我正在创建一个分离数据库的程序

如何检查存储过程是否已无错误运行,以便向用户确认存储过程已完全完成

我在执行过程中使用了
try catch
,但我不能100%确定这会返回所有内部错误

我担心的是,如果我写:

try
{
    cmd.ExecuteNonQuery();
    MessageBox.Show("it has finished");
}
catch (exception ex)
{
ex.ToString();
}
不可靠

我的命令:

 return "sp_detach_db '" + dbType[db] + "', 'true'";

您可以检查ExecuteNonQuery()的值,该值为受影响的行返回一个Int
您还可以分析来自SQL的值以检查错误值

您可以检查ExecuteNonQuery()的值,该值为受影响的行返回Int
您还可以分析来自SQL的异常以检查错误值

如果存储过程能够引发异常,您可以在 试试挡块

create procedure MySp
as
begin

      <some operation>

      if @@error <> 0
      begin
            rollback;
            raiserror('error message', 16, 1);
            return -1;
     end

     return 0;
end
创建过程MySp
作为
开始
如果@错误0
开始
回降;
raiserror('错误消息',16,1);
返回-1;
结束
返回0;
结束

如果存储过程能够引发异常,则可以在 试试挡块

create procedure MySp
as
begin

      <some operation>

      if @@error <> 0
      begin
            rollback;
            raiserror('error message', 16, 1);
            return -1;
     end

     return 0;
end
创建过程MySp
作为
开始
如果@错误0
开始
回降;
raiserror('错误消息',16,1);
返回-1;
结束
返回0;
结束

您的原始代码很好(try/catch)…您传递的字符串是您尝试执行的操作中很棘手的部分。我会看看这个答案,找出返回0或1的命令。。。。。。。。如果返回值为1,则将抛出一个新异常

根据文档:您正在查找返回代码

伪c#码


您的原始代码很好(try/catch)。我会看看这个答案,找出返回0或1的命令。。。。。。。。如果返回值为1,则将抛出一个新异常

根据文档:您正在查找返回代码

伪c#码


您在sql server oracle或MySQL中使用哪个引擎请标记您的dbmsIt是否可靠。如果抛出异常,它将捕获它。您尝试过吗?编写一个将1除以0的存储过程,调用它,看看会发生什么?ExecuteOnQuery将返回受影响的行数。根据您可能希望检查的存储过程,您有超过0行受到影响。请在sql server oracle或MySQL中使用哪个引擎,标记您的dbmsIt是否可靠。如果抛出异常,它将捕获它。您尝试过吗?编写一个将1除以0的存储过程,调用它,看看会发生什么?ExecuteOnQuery将返回受影响的行数。根据存储过程的不同,您可能希望检查是否有超过0行受影响。请查看我对SP的新注释。这是一个默认SQL注释,如果可能,我不想修改,因为这将在100台计算机上使用。此代码具有回滚功能。模板没有begin tran或commit tran。嗯,这是为了编写代码而编写代码……存储过程可以调用sp_detach_db,但是存储过程的内容可以像“return sp_detach_db(args)”一样简单。。不需要额外的@错误检查。任何例外情况都会上升到c#。。。c#代码仍然需要找到返回#代码…(根据我的回答)再次,IMHO。请查看我对SP的新注释。这是一个默认SQL代码,如果可能的话,我不想修改,因为这将在100台机器上使用。此代码具有回滚功能。模板没有begin tran或commit tran。嗯,这是为了编写代码而编写代码……存储过程可以调用sp_detach_db,但是存储过程的内容可以像“return sp_detach_db(args)”一样简单。。不需要额外的@错误检查。任何例外情况都会上升到c#。。。c代码仍然需要找到返回代码…(根据我的回答)再次,IMHO.Great。非常感谢你也看看Gary的答案(和我之前发布的问题一样)。我想这就是我发布代码时的想法。太好了。非常感谢你也看看Gary的答案(和我之前发布的问题一样)。我想这就是我发布代码时的想法。
using (SqlConnection conn = new SqlConnection("MyString"))
using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = string.Format("sp_detach_db '{0}', 'true'", myDatabaseName); /* where myDatabaseName is a string */
    cmd.CommandType = CommandType.Text;


    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    conn.Open();
    cmd.ExecuteNonQuery();
    object result = returnParameter.Value;
    int resultInt = Convert.ToInt32(result);
    if( 0 != resultInt )
    { throw new ArgumentOutOfRangeException("detach failed");}
}