我正在创建一个分离数据库的程序。
如何检查存储过程是否已正常运行而没有错误,以便向用户确认它已完全完成。
我在执行周围使用了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 的状态消息以检查错误值