用ADO连excel,如何把ADODataSet中的数据存入数据库表中?(50分)

  • 主题发起人 heartaching
  • 开始时间
H

heartaching

Unregistered / Unconfirmed
GUEST, unregistred user!
1.我用ADO连接电子表格,为什么总是提示我:
microsoft jet 引擎打不开文件,它已经被别的用户以独占的形式打开,或没有查看数据
的权限。
ADOConnection连接字符串如下:
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;
Data Source=D:/塔河数据/CSBH-1.xls;
Mode=ReadWrite;Extended Properties=excel 8.0;
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
我是用ADOConnection连接到电子表格文件
再用ADODataSet连接到这个adoConnection
2.我如何把ADODataSet中的数据全部读入数据库表中呢?
 
1. 该Excel文件是否正被打开?

2. 我的经验是,ADOConnection最好不要默认打开, 而是用代码打开,
这样在编译的时候就没那么多麻烦事儿
 
thanks
电子表格没有被打开。
如何用代码打开?请给出代码或例子。
 
AdoConnection1.open;
或者
Adoconnection1.connected:=true;
 
第2个问题如何解决呢?我用下面的代码程序没有动静:
while not DataModule2.ADODataSet1.Eof do
begin
DataModule2.ADODataSet1.First;
for I:=0 to DataModule2.ADODataSet1.FieldCount-1 do
begin
DataModule2.ADOQuery1.Fields.AsString:=DataModule2.ADODataSet1.Fields.asstring;
end;
DataModule2.ADODataSet1.Next;
end;
 
DataModule2.ADODataSet1.First; 这句话应该在while循环之外。

你为什么要这样赋值呢?
 
我今天也遭遇此问题
以前试了一下打开没问题
但操作却有毛病
还有用ADOQUERY
select * form sheet1$也不行
 
to yczjs:
select * form sheet1$ 不行的时候

select * form [sheet1$]
试试。
有一次我就是这样解决的。 至今没弄懂。
 
TO Town
该怎么赋值呢?我的方法太复杂了吧
 
to heartaching:
不好说。 看你到底要实现什么功能。 也许有更好的办法。
 
我就是用ADO连接电子表格,然后把其中的数据全部导入数据库表中呀。
用DBGrid试了一下连接成功,看到的数据和电子表格中的一样,可是不知道该怎么样
把ADODataSet中的数据全部导入到我的数据库表中
 
导入到什么类型的数据库表中啊?

应该只用一个ADOQuery足以。 这是我写的把Access表导出到Exl中的过程:
procedure TDM.ImportNames(tnsource, tndest, fn: string);
var
s: string;
begin
if ADOQuery1.Active then
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
s := 'select * into ' + tndest + ' in "' + fn + '" "excel 8.0;" from ' + tnsource;
ADOQuery1.SQL.Add(s);
ADOQuery1.ExecSQL;
end;


调用:
ImportNames('Access表1', 'Excel表1', 'c:/test.xls');

改一改应该就可以用在你的程序中。
 
to Town
不知道是你没看清我的问题,还是你只是给出了你的一个例子,你的例子正好和我的
问题是相反的,我是从电子表格中读数据到SQL Server的数据表中,且表是已经存在的。
我开始是用ADODataSet把电子表格中的数据全读了出来,只是不知道该怎么把数据存入到
我的表中。
用你的例子我没办法反着去实现。
 
sigh.... 不是告诉你改一下么,呵呵。 就是把SQL语句掉过来.
我现在无法测试。 你试试看吧。

s:='select * into YourSQLTable from YourExcelTable in "c:/test.xls" "excel 8.0;"';
ADOQuery1.SQL.Add(s);
ADOQuery1.ExecSQL;
 
To:heartaching
with AdoDataSet1 do
begin
close;
open;
first;
While Not Eof do
begin
AdoQuery1.append;
AdoQuery1.fieldbyname('test').asstring := FieldByName('Source').asstring;
AdoQuery1.post;
end;
end;
 
to Town
我是用如下的代码,但编译运行提示参数定义不符合,所提供的数据不符合或数据不
完整。
parameter object is improperly defined.Inconsistent or incomplete information
was provied.
请帮忙解决一下吧,时间有些紧呀。
procedure TForm1.Button1Click(Sender: TObject);
var
filename:String;
begin
DataModule2.ADOConnection1.Connected:=true;
DataModule2.AdoDataSet1.Active:=true;
DataModule2.ADOQuery1.Active:=true;
filename:='D:/塔河数据/CSBH-1.xls';
readExcel('csbx1','sheet1',filename);
end;

procedure TForm1.readExcel(sqlTable,lxFile,fileInfo: string);
var
s: string;
begin
if DataModule2.ADOQuery1.Active then
DataModule2.ADOQuery1.Close;
DataModule2.ADOQuery1.SQL.Clear;
s := 'select * into '+sqlTable+' from '+lxFile+' in'+fileInfo+'excel 8.0';
DataModule2.ADOQuery1.SQL.Add(s);
DataModule2.ADOQuery1.ExecSQL;
end;
 
to king.gray

你的方法把所有field如此加入就进行死循环,向数据库表中提交的总是同样的数据
有什么方法解决吗?
AdoQuery1.append;
AdoQuery1.fieldbyname('test').asstring := FieldByName('Source').asstring;
AdoQuery1.fieldbyname('***').asstring := FieldByName('***').asstring;
AdoQuery1.fieldbyname('***').asstring := FieldByName('***').asstring;
AdoQuery1.post;

 
问题解决 king.gray的方法容易些。
 
To heartaching:

表已经存在? 那么得这样:
s := 'insert into '+sqlTable+' Select * from '+lxFile+' in "'+fileInfo+'" "Excel 8.0;"';

索引字段可不能重复哦~~
 

Similar threads

顶部