簡體   English   中英

從SqlException中提取結構化信息

[英]Extract structured information from SqlException

假設我從C#應用程序執行了一條SQL語句,該語句導致SqlException並拋出以下錯誤消息:

違反UNIQUE KEY約束“ MyUniqueConstraint”。 無法在對象“ MyTable”中插入重復鍵。 重復的鍵值為(MyValue)。

我知道整個字符串都來自數據庫。 我想從消息中提取相關部分-類似於此問題 ,但我實際上想提取數據,例如MyUniqueConstraintMyTableMyValue ,而不僅僅是SQL錯誤號。

實際上,解析消息不是一個選項,因為它容易出錯:您必須為每個可能的錯誤執行此操作,並且如果錯誤文本從一個版本的SQL Server更改為另一個版本, 則將存在嚴重問題

當發生數據庫級錯誤時(理想情況下是從異常中),是否可以從應用程序中合理地獲取此類結構化信息?

不久前,我遇到了類似的問題 ,並且發現即使根據其數量過濾SqlExceptions也是有問題的。

除此之外,我還沒有遇到可以從SqlException獲取數據詳細信息的解決方案。 也就是說,除了解析消息。 這里的問題之一是服務器消息的文本對於不同的語言和服務器版本是不同的

實際上,我還記得mssql主數據庫中有一個系統表/視圖,其中包含所有不同語言的錯誤消息。 您可以嘗試基於此解析消息,但是某些SqlException甚至不是從服務器端開始的...

我想在這里至少說一點有用的事情,所以:

在名稱空間System.Data中,存在DBConcurrencyException ,它在某種程度上似乎很有用(意味着:在一種情況下,與該問題並不完全相關)。 它具有Row屬性(導致引發異常的行,您可以使用它來獲取表名和數據)。

一廂情願。

我知道整個字符串都來自數據庫

是的,它確實。 它是一個字符串。

實際上,解析消息不是一個選項,因為它容易出錯

解析是唯一選項,因為數據庫僅提供2個項目:sql錯誤號和字符串。 因此,您要么想出一個通用的水晶球,要么就用自己擁有的東西工作-這就是解析。

據我所知,沒有一個數據庫能夠提供神秘地隱藏在異常中的更多信息-如果這樣做,反正不是跨數據庫的標准方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM