c# - server教學 - SQLException:字符串或二進制數據將被截斷




c# sql server教學 (8)

  1. 獲取導致問題的查詢(如果沒有源代碼,也可以使用SQL事件探查器)
  2. 刪除所有WHERE子句和其他不重要的部分,直到基本上只剩下SELECT和FROM部分
  3. 添加WHERE 0 = 1(這將只選擇表結構)
  4. 在FROM子句之前添加INTO [MyTempTable]

你最終會得到類似的東西

SELECT
 Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
  [Tables etc.]
WHERE 0 = 1

這將在您的數據庫中創建一個名為MyTempTable的表,您可以將其與目標表結構進行比較,即您可以比較兩個表上的列以查看它們的不同之處。 這是一個解決方法,但它是我發現的最快的方法。

我有一個C#代碼,批量處理很多插入語句。 在執行這些語句時,我得到“字符串或二進制數據將被截斷”錯誤和事務roledback。

要找出導致這種情況的insert語句,我需要在SQLServer中逐個插入,直到我遇到錯誤。

是否有巧妙的方法來查找哪個語句和哪個字段使用異常處理導致此問題? (SQLEXCEPTION)


也可能是因為您嘗試將null值放回數據庫中。 因此,您的某個事務可能包含空值。


在我們自己的情況下,我增加了sql表允許的字符或字段大小,該大小小於從前端發布的總字符數。 因此,解決了這個問題。


當SQL Server列的數據類型的長度小於輸入到條目表單中的數據的長度時,會發生此類錯誤。


這取決於您如何進行插入調用。 全部作為一個電話,還是作為交易中的個別電話? 如果單獨調用,則為yes(當您遍歷調用時,捕獲失敗的調用)。 如果一個大的電話,那麼沒有。 SQL正在處理整個語句,因此它不受代碼的影響。


這裡的大部分答案都是進行明顯的檢查,即數據庫中定義的列長度不小於您嘗試傳入其中的數據。

有幾次我被SQL Management Studio咬了一口,做得很快:

sp_help 'mytable'

並且混淆幾分鐘直到我意識到有問題的列是nvarchar ,這意味著sp_help報告的長度實際上是支持的實際長度的兩倍,因為它是雙字節(unicode)數據類型。

即如果sp_help報告nvarchar長度為40,則最多可以存儲20個字符。


通常,沒有辦法確定哪個特定語句導致錯誤。 如果您正在運行多個,您可以觀看分析器並查看最後完成的語句,看看之後的語句可能是什麼,但我不知道這種方法是否適合您。

在任何情況下,您的一個參數變量(及其中的數據)對於它試圖存儲數據的字段而言太大。根據列大小檢查參數大小,並且相關字段應該很快就會明顯。


BEGIN TRY
    INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
    --print or insert into error log or return param or etc...
    PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'')
    PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'')
END CATCH




sql-server