小弟的程序中实现数据的导入、导入前,数据与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...什么的?请问该怎么解决阿?
程序代码如下:
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...什么的?请问该怎么解决阿?
解决方案 »
- 跨网段如何来访问
- 深圳千升投资有限公司招DELPHI+SQL程序员10名
- 给steveli放分3,先吊你胃口。
- 急死人了!!! 怎么解决?
- 我的form上有30个edit控件,如何一次性清空?
- 怎样把一个小数格式化为一个指定整数位数和小数位数的值?
- 请问哪里有有关COM原理的Ebook可以下载????
- 请问软件的alpha测试版和beta测试版分别在什么软件工程的那个阶段开始2?
- QRRichText 打印如果页数很多(2页以上),就打印不完全,但打印预览中可以看到全部,为什么?
- 找DELPHI编程拷贝网络文件的高手——DELPHI中编拷贝网络文件出错:谁会解?
- dbgrid如何显示存储过程中的记录集合?
- 用delphi开发的游戏"赏图历险II"准备发布了
'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)
OpenDataSource来实现,很方便的当然楼主这样的方法也是可行的,不过在效率上,有点低
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甘肃'无效,请问这个问题该怎么解决啊?
我的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中的数据结构给破坏了。真让人郁闷。
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
请问用程序写该怎么写呢?我在学习delphi编成呢!
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;
那个问题已经得到了解决!
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;
如楼主上面的方法很正确 hqhhh(枫叶) 的代码完全的正确,并且拷贝过去可以运行,不过Excel不在服务器上能否执行,我认为不可以(个人认为,未测试,可能行,请楼主在两台机器上测试)关于重复记录,没有看出来,具体问题具体分析
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;程序执行时,说参数配置不匹配,请问枫叶这个问题是由于什么原因引起的呢?
我的EXCEL表、SQLSERVER、DELPHI程序都在一台电脑上,是否就是你说的“EXCEL在服务器上了“,如果不是,我该怎么配置呢?
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子句出错
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$)';
' OPENROWSET(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE=e:\myexcel.xls'',sheet1$)';
先用这个行么
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;