2017-06-07 40 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说,看着你的表定义,你将有一个类型不匹配存在。