操作系统:WIN2003
开发环境:CodeGear RAD Studio+SQLSERVER2000及ACCESS
问题描述:我想将SQLSERVER2000的数据导入到ACCESS中提示错误
思路:先建立一个MDB文件,然后在这个MDB文件中建入表,使用SQL语句插入数据。
procedure TFrm.K31Click(Sender: TObject);
const ProviderStr='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=';
{var CardNo,TruckNo:String;
    FirstWeight:Double;
    ProductCode:Integer; //产品代码
    FirstDate:TDateTime;
    FSupplier:Integer;//供应商代码
    FEmp:Integer;//职工代码
    Department:Integer;//部门代码
    InterID:Integer;//通知单内码}
begin
  if SaveDialog1.Execute then
  CreateAccessFile(SaveDialog1.FileName,'') ;
  with ADOCBAK do
  begin
    if not Connected then
      begin
        ConnectionString :=ProviderStr+SaveDialog1.FileName;
        Connected:=true;
      end;
  end;
  with ADOQBAK do
  begin
    Close;
    SQL.Clear;
    SQL.Add('CREATE TABLE 地磅数据 (编号 INT,卡号 string,[日期] DateTime,车牌号码 String,');
    SQL.Add('供应商代码 int,物料代码 int,第一称重 Float,操作员 int,操作部门 int)');
    Connection:=ADOCBAK;
    ExecSQL;
    Close;
    SQL.Clear;
    while not ADOQ1.Eof do
    begin
      ADOQ1.First;
      SQL.Add('Insert into 地磅数据(编号,卡号,日期,车牌号码,供应商代码,物料代码,第一称重,操作员,操作部门);');
      SQL.Add('Values( ');
      SQL.Add('(:InterID_1,:CardNO_1,:FirstDate_1,:TruckNo_1,:FSupplier_1,:ProductCode_1,:FirstWeight_1,:FEmp_1,:Department_1)');
      Parameters.Clear;
      Parameters.Add;
      ParamCheck:=true;
      Parameters[0].Name:='InterID_1';
      Parameters[0].DataType:=ftInteger;
      Parameters[1].Name:='CardNO_1';
      Parameters[1].DataType:=ftString;
      Parameters[2].Name:='FirstDate_1';
      Parameters[2].DataType:=ftDateTime;
      Parameters[3].Name:='TruckNo_1';
      Parameters[3].DataType:=ftString;
      Parameters[4].Name:='FSupplier_1';
      Parameters[4].DataType:=ftInteger;
      Parameters[5].Name:='ProductCode_1';
      Parameters[5].DataType:=ftInteger;
      Parameters[6].Name:='FirstWeight_1';
      Parameters[6].DataType:=ftFloat;
      Parameters[7].Name:='FEmp_1';
      Parameters[7].DataType:=ftInteger;
      Parameters[8].Name:='Department_1';
      Parameters[8].DataType:=ftInteger;
      Parameters.ParamByName('InterID_1').Value:=ADOQ1.FieldByName('编号').Value;
      Parameters.ParamByName('CardNO_1').Value:=ADOQ1.FieldByName('卡号').Value;
      Parameters.ParamByName('FirstDate_1').Value:=ADOQ1.FieldByName('日期').AsDateTime;
      Parameters.ParamByName('TruckNo_1').Value:=ADOQ1.FieldByName('车牌号码').AsString;
      Parameters.ParamByName('FSupplier_1').Value:=ADOQ1.FieldByName('供应商代码').AsInteger;
      Parameters.ParamByName('ProductCode_1').Value:=ADOQ1.FieldByName('物料代码').AsInteger;
      Parameters.ParamByName('FirstWeight_1').Value:=ADOQ1.FieldByName('第一称重').AsFloat;
      Parameters.ParamByName('FEmp_1').Value:=ADOQ1.FieldByName('操作员').Value;
      Parameters.ParamByName('Department_1').Value:=ADOQ1.FieldByName('操作部门').AsInteger;
      Parameters.ParseSQL(SQL.Text,TRUE);
      ADOQBAK.ExecSQL;
    end;
    ADOQ1.Next;
  end;
end;
提示:“List Index Out Of Bounds(1)”不知道是哪里错了,请各位大虾帮忙看看已经两天了还没有查出问题

解决方案 »

  1.   

    1.  while not ADOQ1.Eof do
        begin
          ADOQ1.First;
          .....
          ADOQBAK.ExecSQL;
        end;
        ADOQ1.Next; 
    你的这段代码中就已经遭成死循环了
    2.
          Parameters.Clear;
          Parameters.Add;
          ParamCheck:=true;
          Parameters[0].Name:='InterID_1';
          Parameters[0].DataType:=ftInteger;
          .......
          Parameters[7].Name:='FEmp_1';
          Parameters[7].DataType:=ftInteger;
          Parameters[8].Name:='Department_1';
          Parameters[8].DataType:=ftInteger;
    以这部分代码没有什么作用,因为本身你的SQL中
    {:InterID_1,:CardNO_1,:.....:FEmp_1,:Department_1 }
    这部分中已经写好参数的名称了,你相当于,清了又重设置了一遍.
    3.  你的代码中只在循环开始    
        Close;
        SQL.Clear;  以后就没表清空
    4..我也描述不清了,你自己看一下我改后的代码吧,呵:)
    我改成这样,你试一下(我没有测)
    procedure TForm1.Button1Click(Sender: TObject);
    const ProviderStr='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=';
    {var CardNo,TruckNo:String;
        FirstWeight:Double;
        ProductCode:Integer; //产品代码
        FirstDate:TDateTime;
        FSupplier:Integer;//供应商代码
        FEmp:Integer;//职工代码
        Department:Integer;//部门代码
        InterID:Integer;//通知单内码}
    begin
      if SaveDialog1.Execute then
      CreateAccessFile(SaveDialog1.FileName,'') ;
      with ADOCBAK do
      begin
        if not Connected then
          begin
            ConnectionString :=ProviderStr+SaveDialog1.FileName;
            Connected:=true;
          end;
      end;
      with ADOQBAK do
      begin
        Close;
        SQL.Clear;
        SQL.Add('CREATE TABLE 地磅数据 (编号 INT,卡号 string,[日期] DateTime,车牌号码 String,');
        SQL.Add('供应商代码 int,物料代码 int,第一称重 Float,操作员 int,操作部门 int)');
        Connection:=ADOCBAK;
        ExecSQL;
      end;
      ADOQ1.First;
      while not ADOQ1.Eof do
      begin
        with ADOQBAK do
        begin
          Close;
          SQL.Text := ' Insert into 地磅数据(编号,卡号,日期,车牌号码,供应商代码,物料代码,第一称重,操作员,操作部门)'+
                      ' Values(:InterID_1,:CardNO_1,:FirstDate_1,:TruckNo_1,:FSupplier_1,:ProductCode_1,:FirstWeight_1,:FEmp_1,:Department_1)';
          Parameters.ParamByName('InterID_1').Value:=ADOQ1.FieldByName('编号').AsInteger;
          Parameters.ParamByName('CardNO_1').Value:=ADOQ1.FieldByName('卡号').AsString;
          Parameters.ParamByName('FirstDate_1').Value:=ADOQ1.FieldByName('日期').AsDateTime;
          Parameters.ParamByName('TruckNo_1').Value:=ADOQ1.FieldByName('车牌号码').AsString;
          Parameters.ParamByName('FSupplier_1').Value:=ADOQ1.FieldByName('供应商代码').AsInteger;
          Parameters.ParamByName('ProductCode_1').Value:=ADOQ1.FieldByName('物料代码').AsInteger;
          Parameters.ParamByName('FirstWeight_1').Value:=ADOQ1.FieldByName('第一称重').AsFloat;
          Parameters.ParamByName('FEmp_1').Value:=ADOQ1.FieldByName('操作员').Value;
          Parameters.ParamByName('Department_1').Value:=ADOQ1.FieldByName('操作部门').AsInteger;
          ADOQBAK.ExecSQL;
        end;
        ADOQ1.Next;
      end;
    end;
      

  2.   

    List Index Out Of Bounds(1)”这种错误好像是插入的数据库的数据跟表里的数据有不匹配的情况。
      

  3.   

    问题的原因不在于List Index Out Of Bounds(1)
    而在于,代码中adoquery出现混乱的情况遭成的.