2017-04-13 196 views
0

我正在創建一個分離數據庫的程序。如何查看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

該款發動機是全光照你的SQL Server的Oracle或MySQL –

+1

請標記你的DBMS – McNets

+2

它是可靠的。如果拋出異常,它會捕獲它。 – stuartd

回答

2

你原來的代碼是罰款(try/catch語句)......你傳遞的字符串是你想要做什麼棘手的問題。我會看看這個答案,找出命令返回0或1 ........如果返回值是1,那麼你會拋出一個新的異常。

Calling stored procedure with return value

按照文檔:你是值return_code後。

https://docs.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");} 
} 
+0

太好了。非常感謝 – SCramphorn

+0

看看Gary的回答(我之前發佈的同樣的問題)。 HTTP://計算器。com/questions/6210027/calling-stored-procedure-with-return-value/25674912#25674912我認爲這就是我發佈代碼時想到的。 – granadaCoder

0

您可以檢查的ExecuteNonQuery()的值,返回Int對行受影響 您也可以從SQL解析Status Message以檢查錯誤值

1

如果您的存儲過程能夠引發異常,則可以在您的 try-catch塊中捕獲它。

create procedure MySp 
as 
begin 

     <some operation> 

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

    return 0; 
end 
+0

請看我的新對SP的評論。這是一個默認的SQL,如果可能,我不想修改它,因爲這將在100臺機器上使用。 – SCramphorn

+1

此代碼有回滾。該模板沒有開始或結束。恕我直言,這是爲了編寫代碼而編寫的代碼...存儲過程可以調用sp_detach_db,但存儲過程的內容可能非常簡單,如「返回sp_detach_db(args)」..額外的@@錯誤檢查是不必要的。任何異常將簡單地泡沫到C#...和C#代碼仍然需要找到return_code .....(按照我的答案)再次,恕我直言。 – granadaCoder