我有以下代码
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;
我使用
填充我的comboBoxprocedure 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程序,则弹出
错误我假设它是因为它需要一个整数并且当前是一个字符串 请协助
答案 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 :(得分:0)
属性" DataType" ParamByName不是由你设置的。正如Embarcardero的文档明确指出的那样,这是在分配值时自动设置的。自己设置只会导致奇怪的错误。
您可以使用它来检查类型并执行自己的错误处理等,如:
IF (ADOQuery1.Parameters.ParamByName('field1').DataType = ftInteger)
AND (not TRYSTRTOINT(ComboBox1.Text),myInt) then
ShowMessage('invalid ticket code!');
正如其他回答中所述,查看您的表定义,那里会出现类型不匹配的情况。