如何查看 SQL 查询是否已正确执行而没有错误



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

如何检查存储过程是否已正常运行而没有错误,以便向用户确认它已完全完成。

我在执行周围使用了try catch,但我不是 100% 确定这会返回所有内部错误?

我担心的是,如果我写:

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

不可靠

我的命令:

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

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

使用返回值调用存储过程

根据文档:您是在RETURN_CODE之后。

https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-detach-db-transact-sql

Return Code Values
0 (success) or 1 (failure)
Result Sets
None

伪 C# 代码

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");}
}

如果存储过程能够引发异常,则可以在尝试捕获块。

create procedure MySp
as
begin
      <some operation>
      if @@error <> 0
      begin
            rollback;
            raiserror('error message', 16, 1);
            return -1;
     end
     return 0;
end

您可以检查 ExecuteNonQuery(( 的值,该值返回受影响的行的 Int您还可以解析来自 SQL 的状态消息以检查错误值

最新更新