SqlException 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
當 SQL Server 回傳警告或錯誤時拋出的例外。 此類別無法獲得繼承。
public ref class SqlException sealed : SystemException
public ref class SqlException sealed : System::Data::Common::DbException
[System.Serializable]
public sealed class SqlException : SystemException
[System.Serializable]
public sealed class SqlException : System.Data.Common.DbException
[<System.Serializable>]
type SqlException = class
inherit SystemException
[<System.Serializable>]
type SqlException = class
inherit DbException
Public NotInheritable Class SqlException
Inherits SystemException
Public NotInheritable Class SqlException
Inherits DbException
- 繼承
- 繼承
- 屬性
範例
以下範例會產生 並 SqlException 顯示例外。
public static void ShowSqlException(string connectionString)
{
string queryString = "EXECUTE NonExistantStoredProcedure";
StringBuilder errorMessages = new StringBuilder();
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
try
{
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (SqlException ex)
{
for (int i = 0; i < ex.Errors.Count; i++)
{
errorMessages.Append("Index #" + i + "\n" +
"Message: " + ex.Errors[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
Console.WriteLine(errorMessages.ToString());
}
}
}
Public Sub ShowSqlException(ByVal connectionString As String)
Dim queryString As String = "EXECUTE NonExistantStoredProcedure"
Dim errorMessages As New StringBuilder()
Using connection As New SqlConnection(connectionString)
Dim command As New SqlCommand(queryString, connection)
Try
command.Connection.Open()
command.ExecuteNonQuery()
Catch ex As SqlException
Dim i As Integer
For i = 0 To ex.Errors.Count - 1
errorMessages.Append("Index #" & i.ToString() & ControlChars.NewLine _
& "Message: " & ex.Errors(i).Message & ControlChars.NewLine _
& "LineNumber: " & ex.Errors(i).LineNumber & ControlChars.NewLine _
& "Source: " & ex.Errors(i).Source & ControlChars.NewLine _
& "Procedure: " & ex.Errors(i).Procedure & ControlChars.NewLine)
Next i
Console.WriteLine(errorMessages.ToString())
End Try
End Using
End Sub
備註
當 .NET Framework Data Provider for SQL Server 遇到伺服器產生錯誤時,會建立此類別。 (用戶端錯誤會作為標準的通用語言執行時例外拋出。) SqlException 總是至少包含一個 的 SqlError實例。
嚴重程度等級在10以下的訊息是資訊性訊息,表示因使用者輸入資訊錯誤而產生的問題。 11到16的嚴重程度等級由使用者產生,並可由使用者自行修正。 17至25的嚴重程度表示軟體或硬體錯誤。 當發生第 17、18 或 19 級錯誤時,你可以繼續工作,但可能無法執行特定語句。
當嚴重程度低於19時,該系統 SqlConnection 仍保持開放。 當嚴重程度等級達到 20 或以上時,伺服器通常會關閉 SqlConnection。 不過,使用者可以重新開啟連線並繼續使用。 在這兩種情況下,a SqlException 都是由執行指令的方法產生。
關於SQL Server發送的警告及資訊訊息,請參見資料庫引擎事件與錯誤。 SqlException 類別對應到SQL Server嚴重度。
以下是關於處理例外的一般資訊。 你的程式碼應該能偵測例外,防止應用程式當機,並允許使用者顯示相關的錯誤訊息。 你可以使用資料庫交易來確保資料一致,無論用戶端應用程式發生什麼(包括當機)。 像是 System.Transaction.TransactionScope 或 BeginTransaction 方法(見 System.Data.OleDb.OleDbConnection、System.Data.ODBC.ODBCConnection 和 System.Data.SqlClient.SqlConnection)等功能,確保資料無論提供者提出什麼例外都能保持一致。 交易可能會失敗,所以要抓出失敗並重試交易。
請注意,從 Framework 4.5 開始,.NETSqlException 可以回傳一個內部的 Win32Exception。
.NET Framework 資料提供者的例外類別會報告提供者特定的錯誤。 例如 System.Data.Odbc 有 OdbcException,System.Data.OleDb 有 OleDbException,System.Data.SqlClient 有 SqlException。 為了獲得最佳的錯誤細節,可以捕捉這些例外,並利用這些例外類別的成員來取得錯誤的詳細資料。
除了提供者專屬錯誤外,.NET Framework 的資料提供者類型還可能引發 .NET Framework 的例外,例如 System.OutOfMemoryException 和 System.Threading.ThreadAbortException。 這些例外情況可能無法恢復。
錯誤輸入可能導致 .NET Framework 的資料提供者類型產生異常,例如 System.ArgumentException 或 System.IndexOutOfRangeException。 在錯誤的時間呼叫方法可能會引發 System.InvalidOperationException。
所以,一般來說,寫一個例外處理器,能捕捉任何提供者特定的例外,以及來自通用語言執行時的例外。 這些可以分層如下:
try {
// code here
}
catch (SqlException odbcEx) {
// Handle more specific SqlException exception here.
}
catch (Exception ex) {
// Handle generic ones here.
}
或者:
try {
// code here
}
catch (Exception ex) {
if (ex is SqlException) {
// Handle more specific SqlException exception here.
}
else {
// Handle generic ones here.
}
}
.NET Framework 的資料提供者方法呼叫也可能在沒有使用者程式碼堆疊的執行緒池執行緒中失敗。 在這種情況下,以及使用非同步方法呼叫時,你必須註冊 UnhandledException 該事件來處理這些例外,避免應用程式當機。
屬性
| 名稱 | Description |
|---|---|
| Class |
取得 .NET Framework 資料提供者 SQL Server 回傳錯誤的嚴重程度等級。 |
| ClientConnectionId |
代表用戶端連線 ID。 欲了解更多資訊,請參閱 ADO.NET 中的資料追蹤。 |
| Data |
取得索引鍵/值組的集合,提供例外狀況的其他使用者定義資訊。 (繼承來源 Exception) |
| ErrorCode |
明白 |
| Errors |
取得一個或多個 SqlError 物件的集合,提供 .NET Framework Data Provider for SQL Server 產生的異常詳細資訊。 |
| HelpLink |
取得或設定與這個例外狀況相關聯的說明檔連結。 (繼承來源 Exception) |
| HResult |
取得或設定 HRESULT,這是指派給特定例外狀況的編碼數值。 (繼承來源 Exception) |
| InnerException |
會取得 Exception 造成目前例外的實例。 (繼承來源 Exception) |
| LineNumber |
取得產生錯誤的 Transact-SQL 指令批次或儲存程序中的行號。 |
| Message |
會看到描述錯誤的文字。 |
| Message |
取得描述目前例外狀況的訊息。 (繼承來源 Exception) |
| Number |
會得到一個編號,用來辨識錯誤的類型。 |
| Procedure |
取得產生錯誤的儲存程序或遠端程序呼叫(RPC)名稱。 |
| Server |
取得執行 SQL Server 實例並產生錯誤的電腦名稱。 |
| Source |
會取得產生錯誤的提供者名稱。 |
| StackTrace |
取得呼叫堆疊上即時框架的字串表示。 (繼承來源 Exception) |
| State |
從 SQL Server 收到一個數字錯誤代碼,代表錯誤、警告或「找不到資料」訊息。 欲了解更多如何解碼這些值的資訊,請參閱 資料庫引擎事件與錯誤。 |
| TargetSite |
取得擲回目前例外狀況的方法。 (繼承來源 Exception) |
方法
| 名稱 | Description |
|---|---|
| Equals(Object) |
判斷指定的 物件是否等於目前的物件。 (繼承來源 Object) |
| GetBaseException() |
當在派生類別中被覆寫時,回傳 Exception 是一個或多個後續例外的根因。 (繼承來源 Exception) |
| GetHashCode() |
做為預設雜湊函式。 (繼承來源 Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
使用例外狀況的相關信息來設定 SerializationInfo。 |
| GetType() |
取得目前實例的運行時間類型。 (繼承來源 Exception) |
| MemberwiseClone() |
建立目前 Object的淺層複本。 (繼承來源 Object) |
| ToString() |
回傳一個代表當前 SqlException 物件的字串,並包含用戶端連線 ID(更多資訊請參見 ClientConnectionId)。 |
| ToString() |
建立並傳回目前例外狀況的字串表示。 (繼承來源 Exception) |
| ToString() |
回傳包含錯誤 HRESULT 的字串。 (繼承來源 ExternalException) |
事件
| 名稱 | Description |
|---|---|
| SerializeObjectState |
發生於例外狀況串行化以建立例外狀況狀態物件,其中包含例外狀況的串行化數據。 (繼承來源 Exception) |