小弟的程序中实现数据的导入、导入前,数据与sql表中的数据进行比较选出重复的纪录保存在另外的表中。  
程序代码如下: 
procedure TForm_table_query.ToolButton1Click(Sender: TObject);
var
  xlapp, sheet : variant;
  filename: string;
  i: integer;
  j: integer;
  k: integer;
begin
  OpenDialog1.Execute;
  try
    xlapp := createoleobject('excel.application');
  except
    showmessage('无法打开Xls文件,请确认已经安装EXCEL!');
    exit;
  end;
  filename := OpenDialog1.FileName;
  xlapp.WorkBooks.Open(filename);
  Sheet :=xlapp.workbooks[1].worksheets[1];
  for j:=2 to sheet.usedRange.Cells.rows.count do
  begin
//    showmessage(sheet.usedRange.Cells.rows.count);
    dm1.aq_occasional.Active:=true;
    dm1.aq_occasional.Append;
    with dm1.aq_occasional do
    begin
      k:=0;
      for i:=1 to sheet.usedRange.Cells.Columns.count  do
      begin
        Fields[k].Value:=sheet.usedRange.Cells[j,i];
        k:=k+1;
      end;
    end;
  end;
  dm1.aq_occasional.Edit;
  dm1.aq_occasional.Post;
  showmessage('导入数据成功!');
  xlapp.quit;
  dm1.ds_occasional.DataSet := dm1.aq_occasional;
  dm1.aq_occasional.Close;
  dm1.aq_occasional.SQL.Clear;
  dm1.aq_occasional.SQL.Add('select * from occasional_table');
  dm1.aq_occasional.Open;
end;
 
procedure TForm_table_query.ToolButton3Click(Sender: TObject);
begin //查出重复的记录,先把它保存在表enterprise_1中,然后把它从occasional_table表中删除
  dm1.aq_check.Close;
  dm1.aq_check.SQL.Clear;
  dm1.aq_check.SQL.Add('insert into enterprise_1 select occasional_table.* from occasional_table,enterprise where enterprise.name = occasional_table.name or enterprise.fuzeren = occasional_table.fuzeren');
  dm1.aq_check.ExecSQL;
  dm1.DS_Enterprise_1.DataSet := dm1.AT_Enterprise_1;
  dm1.AT_Enterprise_1.Active := true;
  dm1.AT_Enterprise_1.Close;
  dm1.AT_Enterprise_1.Open;
  dm1.aq_occasional.Close;
  dm1.aq_occasional.SQL.Clear;
  dm1.aq_occasional.SQL.Add('delete occasional_table where occasional_table.name in (select occasional_table.name from occasional_table,'+
'enterprise where occasional_table.name=enterprise.name)');
  dm1.aq_occasional.ExecSQL;
end;procedure TForm_table_query.ToolButton6Click(Sender: TObject);
begin      //把不重复的记录插入到enterprise中,然后删除occasional_table中的所有数据
  dm1.aq_check.Close;
  dm1.aq_check.SQL.Clear;
  dm1.aq_check.SQL.Add('insert into enterprise select occasional_table.* from occasional_table,enterprise where enterprise.name <> occasional_table.name');
  dm1.aq_check.ExecSQL;
  dm1.DS_Enterprise.DataSet := dm1.AT_Enterprise;
  dm1.AT_Enterprise.Active := true;
  dm1.AT_Enterprise.Close;
  dm1.AT_Enterprise.Open;
  dm1.aq_occasional.Close;
  dm1.aq_occasional.SQL.Clear;
  dm1.aq_occasional.SQL.Add('truncate table occasional_table');
  dm1.aq_occasional.ExecSQL;
end; 编译没错!
第一次导入时完全正常!问题一:enterprise表中没有记录时,occasional_table中的纪录插入不到enterprise中,当enterprise表中有一条记录时,occasional_table中的纪录正常插入到enterprise中,当enterprise中有两条记录时,occasional_table中的纪录能插入到enterprise中,但occasional_table中的每条纪录都出现两条,当enterprise中有十条记录时,occasional_table中的纪录能插入到enterprise中,但occasional_table中的每条纪录都出现十次。  
请问前辈们,这个问题该怎么解决啊?
  
问题二:第一次从excel中导入数据时,一切正常,当接着进行第二次导入时,报错,错误信息记得不太清楚了,记得有commandtext...  not...什么的?请问该怎么解决阿?

解决方案 »

  1.   

    你的SQL语句好象有点问题:
    'insert into enterprise select occasional_table.* from occasional_table,enterprise where enterprise.name <> occasional_table.name'改成如下:
    Insert Into enterprise 
      select * from occasional_table
      where [name] not in (select [name] from enterprise)
      

  2.   

    另外:从Excel中导入数据,可以用
    OpenDataSource来实现,很方便的当然楼主这样的方法也是可行的,不过在效率上,有点低
      

  3.   

    报错,错误信息是:commandtext does not return a result set,这是问题该怎么解决啊?
      

  4.   

    小弟写的模糊查询程序:
    procedure Tformenterprise.Button4Click(Sender: TObject);
    var
      n,c : string;
    begin
      inherited;
      if edit2.text='' then
      begin
        showmessage('请输入关键字');
      end
      else
      begin
        n:= trim(edit2.Text);
        dm1.ADODataSet1.Close;
        c :='select * from enterprise where name like' +n;
        dm1.ADODataSet1.CommandText := c;
        dm1.ADODataSet1.Open;
      end;
    end;编译没错!
    程序运行时错误信息'like甘肃'无效,请问这个问题该怎么解决啊?
      

  5.   

    78hgdong(赤脚) 
    我的SQL中的纪录没有重复纪录,因为只有几条记录,所以不会看错
      

  6.   

    小弟写了个从excel导入到sql的程序,运行时报错,请高手帮忙看看错在哪里?
    var
      str,sqlstr,connstr,connstr1,sheetName,filename:string;
    begin
      opendialog1.Execute;
      FileName :=opendialog1.FileName;  //文件名
      sheetname := 'Sheet1';
      dm1.aq_occasional.Close ;
      dm1.aq_occasional.SQL.Clear ;
      ConnStr :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+FileName+';Extended Properties=Excel 8.0;Persist Security Info=False';
      dm1.aq_occasional.ConnectionString :=ConnStr ;
      SqlStr :='Select * from ' +'['+ SheetName + '$'+']';
      dm1.aq_occasional.SQL.Add(SqlStr) ;
      dm1.aq_occasional.Prepared ;
      dm1.aq_occasional.Open;
      dm1.ds_occasional.DataSet := dm1.aq_occasional;
      dbgrid1.DataSource := dm1.ds_occasional;
      dm1.aq_occasional.Close;
      dm1.aq_occasional.SQL.Clear;
      dm1.aq_occasional.ConnectionString := connstr;
      dm1.aq_occasional.SQL.Add('select * into occasional_table from (excel 8.0;data source='+filename+').[sheet1$]');
      dm1.aq_occasional.ExecSQL;执行程序后,dbgrid1中可以显示excel中的数据,但是occasional_table表中没有excel中的数据,而且导入后,还把excel中的数据结构给破坏了。真让人郁闷。
      

  7.   

    可以SQLServer的OpenDataSource功能直接导入!1.查询
    SELECT * 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
     
    2.插入
    Insert Into Table1(Field1, Field2)
    SELECT aa1,aa2 
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
      'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
     
      

  8.   

    TO:枫叶
    请问用程序写该怎么写呢?我在学习delphi编成呢!
      

  9.   

    程序运行时错误信息'like甘肃'无效,请度试试n:= quotedstr(trim(edit2.Text));
      

  10.   

    with ADOQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Insert Into Table1(Field1, Field2)' +
        ' SELECT aa1,aa2 ' +
        ' FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'', ' +
        '  ''Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended  properties=Excel 5.0'')...xactions ') ;
      Open;
    end;
      

  11.   

    谢谢peterluolaw(木瓜) :
    那个问题已经得到了解决!
      

  12.   

    不知道你是不是要这个,直接拷贝过去可以运行,把Excel中数据导入到Sql中,Excel必须放在SqlServer服务器上
    var
      Sql : String;
    begin
      ADOQuery1.Close;//ADOQuery1连接SqlServer的Connection
      ADOQuery1.SQL.Clear;//清空Sql
      Sql:='Insert Into A_tt SELECT * FROM '+ //A_tt 为SqlServer表的名称    
      '  OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE=e:\myexcel.xls'',sheet1$)' ;//sheet1$要求的Excel表格
      ADOQuery1.SQL.Add(Sql);//执行Sql
      ADOQuery1.ExecSQL;
    end;
      

  13.   

    如果Excel不在服务器上,则要求把Excel读入到内存,最好读入到临时表中,然后用Sql语法导入
    如楼主上面的方法很正确 hqhhh(枫叶) 的代码完全的正确,并且拷贝过去可以运行,不过Excel不在服务器上能否执行,我认为不可以(个人认为,未测试,可能行,请楼主在两台机器上测试)关于重复记录,没有看出来,具体问题具体分析
      

  14.   

    小弟用枫叶的方法写的代码如下;
    with dm1.aq_occasionaldo
    begin
      Close;
      SQL.Clear;
      SQL.Add('Insert Into occasional_table' +
        ' SELECT *' +
        ' FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'', ' +
        '  ''Data Source='+filename+';User ID=Admin;Password=;Extended  properties=Excel 5.0'')...xactions ') ;
      Open;
    end;程序执行时,说参数配置不匹配,请问枫叶这个问题是由于什么原因引起的呢?
      

  15.   

    TO:cdsgajxlp(起名很难) 
    我的EXCEL表、SQLSERVER、DELPHI程序都在一台电脑上,是否就是你说的“EXCEL在服务器上了“,如果不是,我该怎么配置呢?
      

  16.   

    如果Excel不在SqlSergver服务器(指安装SqlServer的计算机)上,则要求把Excel读入到内存,最好读入到临时表中,然后用Sql语法导入,如楼主上面的方法很正确
      

  17.   

    用 cdsgajxlp(起名很难) 的方法试过了,excel在安装SqlServer的计算机
    var
      Sql : String;
    begin
      dm1.aq_occasional.Close;//ADOQuery1连接SqlServer的Connection
      dm1.aq_occasional.SQL.Clear;//清空Sql
      Sql:='Insert Into A_tt SELECT * FROM '+ //A_tt 为SqlServer表的名称    
      '  OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE='''+filename+''''',sheet1$)' ;//sheet1$要求的Excel表格
      dm1.aq_occasional.SQL.Add(Sql);//执行Sql
      dm1.aq_occasional.ExecSQL;
    end;
    程序运行时报“不正常的定义参数对象。提供了不一致或不完整的信息。”把database='+filename+'''后报from子句出错
      

  18.   

    to :cdsgajxlp(起名很难)
    sql已经改成了下面这样
    sql :='Insert Into occasional_table SELECT * FROM '+ //A_tt 为SqlServer表的名称    
      '  OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='''+filename+''''',sheet1$)';
      

  19.   

    sql :='Insert Into occasional_table SELECT * FROM '+ 
      '  OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE=e:\myexcel.xls'',sheet1$)';
    先用这个行么
      

  20.   

    字段名寫出來:
    var
      Sql : String;
    begin
      ADOQuery1.Close;                    //ADOQuery1?接SqlServer的Connection
      ADOQuery1.SQL.Clear;                 //清空Sql
      Sql:='Insert Into Tbl1(id,name,sex,ph,aDAT) SELECT id,name,sex,ph,aDAT FROM OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES;DATABASE=d:\d.xls'',sheet1$)' ;//sheet1$要求的Excel表格字段名要寫出來才不會出錯。
      ADOQuery1.SQL.Add(Sql);//?行Sql
      ADOQuery1.ExecSQL;
    end;
      

  21.   

    c :='select * from enterprise where name like ''%'+n+'%'''