2009-10-21 58 views
3

我得到一個「SQL Server錯誤:算術異常,數值溢出或字符串截斷」錯誤捕獲異常使用TSQLQuery和PARAMS

這裏是低於

AQuery:= TSQLQuery.Create(nil); 
with AQuery do 
begin 
SQLConnection:- AConnection; 
SQL.Text:= 'Insert into.....'; 
ParamByName('...').asString:= 'PCT'; 
. 
. 
. 

try 
    ExecSQL; 
finally 
    AQuery.Free; 
end; 
end; 

我有很多ParamByName的代碼線,我不知道哪一個是拋出異常。我只知道它投入ExecSQL產品線。我怎麼知道哪個paramByName導致錯誤?

+4

沒有看到這些參數和查詢它很難說。 – 2009-10-21 18:24:53

回答

0

您試圖插入字符串值進入一個不足以保存價值的領域。根據表格中字段的長度檢查插入值的長度。

+0

這是列出的三種可能性之一。讀取OP收到的錯誤消息會給你另外兩個。 – 2009-10-22 12:54:34

1

在參數替換後獲取SQL文本並在SQL Server管理工作室中將其作爲查詢運行。
你可以從那裏調試它。

2

當你有表的元數據時,檢查字符串字段的最大長度。調試時,檢查您輸入parambynames的字符串的長度。還要檢查數字字段的類型,並確保不超過最大值。 (我曾經遇到過一個字符串,其長度超過了表中的varchars長度,並且有一個smallint數據庫字段出現此問題,我試圖設置太高的值)

0

正如其他人所說,幾乎可以肯定的是,你正在向你的一個領域推送太大的字符串。它也可能發生在數值上,但最有可能是一個字符串。

我建議你暫時改變你的每個ParamByName('')。AsString:= blah帶有文本常量的行,例如:

 
ParamByName('surname').AsString:='Smith'; 
ParamByName('firstname').AsString:='John'; 

等,看看你是否得到一個錯誤。如果它沒有發生錯誤,那麼你的問題很可能是你的一個字符串參數太長。檢查你的表模式並調試你正在放入參數中的實際字符串。

根據您對此擁有多少訪問權限(和經驗),您可能會發現它更有助於打開SQL Server日誌記錄,以便您可以在獲取處理時看到您的查詢(以及這些參數的內容)由SQL服務器。這會向您顯示確切地給出服務器的字符串和數字值。 您使用的是哪個版本的SQL Server?