我正在使用 SQL Server 作為后端的 C# 開發 Windows 應用程式。我必須向應用程式顯示在存盤程序中生成的錯誤訊息,該錯誤訊息在 try catch 塊中處理。如果我們使用ExecuteNonQuery(). 存盤程序將回傳一個 ID,因此我正在使用ExecuteScalar()并且來自 catch 塊的錯誤訊息未顯示。
如果我們洗掉 try catch 塊,ExecuteScalar也會顯示錯誤。
它不會顯示在客戶端。
begin
begin try
select 1/0
select 10
end try
begin catch
raiserror (' Some Error Message', 16, 10)
end catch
end
它將顯示在客戶端。
begin
select 1/0
raiserror (' Some Error Message', 16, 10)
select 10
end
請提供解決方案。
uj5u.com熱心網友回復:
為了確保檢測到 SqlException,客戶端必須使用所有結果集。ExecuteScalar()僅回傳結果的第一行/列,但不使用其余結果,因此客戶端 API 不會引發例外。
ExecuteScalar()此示例代碼將通過避免和消耗所有結果來引發錯誤:
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(sqlBatchText, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
scalarIntResult = reader.GetInt32(0);
}
while (reader.Read()) { }; //consume remainder of first result
while (reader.NextResult()) { }; //consume subsequent results
}
}
}
catch
{
throw;
}
以下是可能發生未檢測到的 SqlExceptions 的常見情況。如果不采用上述防御性編程技術,則撰寫 T-SQL 代碼以確保不會發生這些情況很重要。
- 在執行行回傳陳述句時,T-SQL TRY/CATCH 捕獲到錯誤。
- 回傳行陳述句成功執行后發生錯誤。
- 回傳行計數訊息后發生錯誤(取決于客戶端 API)。
有關更多詳細資訊,請參閱本文。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504367.html
