我在这里做错了什么,因为没有数据插入到我的ARCHIVE表中 虽然我的T_Main表中有3条记录,其中ACCOMPLISHED = True?
数据库是Accuracer。
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
begin
case cxRadioGroup1.ItemIndex of
0: begin
if MessageDlg('Are you sure ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
begin Exit;
end else
Data_Module.T_MAIN.First;
while not Data_Module.T_MAIN.Eof do begin
Data_Module.INS_ARCH.Close;
Data_Module.INS_ARCH.SQL.Clear;
Data_Module.INS_ARCH.SQL.Text :='INSERT INTO ARCHIVE (T_ID,FOR_DATE,DONE_WHEN)'
+ 'SELECT :a3,:a4,:a5 FROM T_MAIN WHERE ACCOMPLISHED =True ';
Data_Module.INS_ARCH.Params.ParamByName('a3').AsInteger := Data_Module.T_MAIN.FieldByName('T_ID').AsInteger;
Data_Module.INS_ARCH.Params.ParamByName('a4').AsDate := Data_Module.T_MAIN.FieldByName('FOR_DATE').AsDateTime;
Data_Module.INS_ARCH.Params.ParamByName('a5').AsDate := Data_Module.T_MAIN.FieldByName('DONE_WHEN').AsDateTime;
Data_Module.T_MAIN.Next;
Data_Module.INS_ARCH.ExecSQL;
end;
end;
end;
答案 0 :(得分:1)
您不应该使用字段名称参数。它并不意味着那个。参数用于实际数据值。请注意这个其他问题/答案:How to use ADO Query Parameters to specify table and field names?尽管正如moskito-x的回答中所解释的那样,您真正的问题是您传递的数据值就像他们的字段名称一样。
另一方面,您的代码还有其他问题。这是我尝试至少清理它以便您更好地阅读它:
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
begin
case cxRadioGroup1.ItemIndex of
0: begin
if MessageDlg('Are you sure ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
Data_Module.T_MAIN.First;
while not Data_Module.T_MAIN.Eof do begin
Data_Module.INS_ARCH.Close;
Data_Module.INS_ARCH.SQL.Clear;
Data_Module.INS_ARCH.SQL.Text :='INSERT INTO ARCHIVE (T_ID,FOR_DATE,DONE_WHEN)'
+ 'SELECT :a3,:a4,:a5 FROM T_MAIN WHERE ACCOMPLISHED =True ';
Data_Module.INS_ARCH.Params.ParamByName('a3').AsInteger := Data_Module.T_MAIN.FieldByName('T_ID').AsInteger;
Data_Module.INS_ARCH.Params.ParamByName('a4').AsDate := Data_Module.T_MAIN.FieldByName('FOR_DATE').AsDateTime;
Data_Module.INS_ARCH.Params.ParamByName('a5').AsDate := Data_Module.T_MAIN.FieldByName('DONE_WHEN').AsDateTime;
Data_Module.T_MAIN.Next;
Data_Module.INS_ARCH.ExecSQL;
end;
end else begin
Exit;
end; //MessageDlg
end; //case = 0
end; //case
end; //procedure
另外需要注意的是,由于这些都在数据模块中,因此该程序也不应该在数据模块内部吗?它让我担心每个电话如何引用Data_Module.
。
答案 1 :(得分:1)
您的查询错误
Data_Module.INS_ARCH.SQL.Text :='INSERT ... SELECT :a3,:a4,:a5 FROM T_MAIN ....';
用数据填充参数,而不是真正的数据库字段 例如:
Data_Module.INS_ARCH.SQL.Text :='INSERT ... SELECT 1000, 2015-08-22, 2015-08-01 FROM T_MAIN ....';
EDIT 从你的回答:
这当然有效,因为您在select语句中设置了有效的字段名称。
SELECT T_ID,FOR_DATE,DONE_WHEN FROM T_MAIN
使用您的代码,您的选择就像
SELECT 1000, 2015-08-22, 2015-08-01 FROM T_MAIN
答案 2 :(得分:0)
它似乎有效:
procedure TForm1.AdvGlowButton1Click(Sender: TObject);
begin
case cxRadioGroup1.ItemIndex of
0: begin
if MessageDlg('Are you sure ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
begin Exit;
end else begin
Data_Module.INS_ARCH.Close;
Data_Module.INS_ARCH.SQL.Clear;
Data_Module.INS_ARCH.SQL.Text :='INSERT INTO ARCHIVE (T_ID,FOR_DATE,DONE_WHEN) SELECT T_ID,FOR_DATE,DONE_WHEN FROM T_MAIN WHERE ACCOMPLISHED =True ';
Data_Module.INS_ARCH.ExecSQL;
end;
end;
end;