2017-06-07 39 views
-3

我有以下代碼Parameters.ParamByname不接受字符串值德爾福

procedure TFrmMain.ComboBox1KeyPress(Sender: TObject; var Key: Char); 
begin 



if Key = #13 then 
begin 
    ADOQuery1.close; 
    ADOQuery1.sql.Text := 'INSERT INTO palletweighttemp(TickCode,SchedID,BatchNo)values'; 
    ADOQuery1.SQL.Add(' (:field1,(select SchedID from TicketBatch where TickCode =:field1),'); 
    ADOQuery1.SQL.Add('(select BatchNo from TicketBatch where TickCode =:field1))'); 
    ADOQuery1.Parameters.ParamByName('field1').DataType := ftString; 
    ADOQuery1.Parameters.ParamByName('field1').Value := ComboBox1.Text; 
    ADOQuery1.ExecSQL; 
     PopulateDBGrid; 
     ComboBox1.SetFocus; 
     end; 

end; 

我填充使用

procedure TFrmMain.PopulateBoxes(); 
begin 
ComboBox1.SetFocus; 

ComboBox1.Perform(WM_SYSKEYDOWN, VK_TAB, 0); 

ComboBox1.clear; 
ADOQuery1.sql.add 
('select * from TicketBatch where isProcesed = 0 and TickCode is not null'); 
ADOQuery1.open; 
ComboBox1.Text := ''; 
while not ADOQuery1.Eof do 
begin 
ComboBox1.Items.add(ADOQuery1.FieldByName('TickCode').AsString); 
ADOQuery1.Next; 
end; 
ADOQuery1.close; 



end; 

如果我回車來運行我的Combobox1KeyPress程序錯誤彈出我的組合框那enter image description here

我假設這是因爲它需要一個整數,目前是一個字符串 請幫助

+0

那麼'TickCode'列是一個'int'類型?如果是這樣,不要爲它定義一個參數作爲字符串,甚至不會認爲你可以在那裏插入文本值「F105165」。該值意味着是十六進制數字還是要存儲到該列的文本值? – Victoria

+0

該值是一個字符串類型,需要將其存儲爲字符串 –

+0

以調試器模式運行項目。它在什麼方面停止提出這個錯誤?知道這條線將幫助你確定原因。 –

回答

3

您必須確保兩個表中的列數據類型匹配,以便查詢參數數據類型與兩個表中的列數據類型相匹配。與您的當前代碼的表需要像定義:

PalletWeightTemp.TickCode→TicketBatch.TickCode→(N)VARCHAR PalletWeightTemp.SchedID→TicketBatch.SchedID→相同的數據類型 PalletWeightTemp.BatchNo→TicketBatch.BatchNo →相同的數據類型

一旦您將其定義如此,錯誤消息應該消失。如果不是,我將關注的另一個可能的錯誤來源是包含類似不匹配數據類型查詢的插入觸發器。最後

一個音符查詢本身 - 它可以這樣簡單(它消除冗餘子查詢):

INSERT INTO PalletWeightTemp 
    (TickCode, SchedID, BatchNo) 
SELECT 
    :TickCode, SchedID, BatchNo 
FROM 
    TicketBatch WHERE TickCode = :TickCode 
+1

非常好的答案,+1,考慮到缺乏在理論上,OP應該在這種情況下提供一個MCVE,但希望這足以讓他繼續。 – MartynA

0

ParamByName的財產「數據類型」是不是被你設置。正如Embarcardero的文件中明確指出的那樣,這是在賦值後自動設置的。自己設置只會導致奇怪的錯誤。

你可以用它來檢查類型和做自己的錯誤處理等,如:

IF (ADOQuery1.Parameters.ParamByName('field1').DataType = ftInteger) 
AND (not TRYSTRTOINT(ComboBox1.Text),myInt) then 
    ShowMessage('invalid ticket code!'); 

至於其他answeres說,看着你的表定義,你將有一個類型不匹配存在。