为什么没有插入数据?

时间:2015-08-22 13:01:47

标签: delphi

我在这里做错了什么,因为没有数据插入到我的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;

3 个答案:

答案 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 ....';
  • 您是 1000 还是 2015-08-22 2015-08-01 是真正存在的数据库字段?

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;