现在sql里有book的表,里面有
id 书名 价格
id bookname price
1 社会与科学 18
2 delphi入门 25
3 百科 30在delphi里现在希望先把数据保存到dbgrid中,然后点“批量插入”时,把刚才所有存到dbgrid的数据插入到sql可,问一下大家怎么才能做到,有二个关键代码1.button1:“插入到dbgrid中”的关键代码
2.button2:"批量插入到数据库中"的关键代码谢谢大家!
id 书名 价格
id bookname price
1 社会与科学 18
2 delphi入门 25
3 百科 30在delphi里现在希望先把数据保存到dbgrid中,然后点“批量插入”时,把刚才所有存到dbgrid的数据插入到sql可,问一下大家怎么才能做到,有二个关键代码1.button1:“插入到dbgrid中”的关键代码
2.button2:"批量插入到数据库中"的关键代码谢谢大家!
从excel读数据,然后利用
adoquery.append;
adoquery.fieldbyname('').value := 读的值
....
... 然后,对dbgrid进行编辑.
最后adoquery.post;就达到了批量提交了.
但这里要用事务来控制. 读Excel代码:利用一个结构体,供你参考 var
RangeMatrix: Variant;
OpenDialog1: TOpenDialog;
iRE: integer;
IN_TYPE,vStockName: String;
sStockName,sCompany: String;
i: Integer;
MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
ASN2_NEW: PASN2_NEW;
begin
OpenDialog1:=TOpenDialog.Create(nil);
try
OpenDialog1.FileName:='*.csv;*.xls';
if not OpenDialog1.Execute then
begin
Result := false;
exit;
end;
MsExcel := CreateOleObject('Excel.Application');
MsExcelWorkBook := msExcel.Workbooks.Open(OpenDialog1.FileName);
MsExcelWorkSheet := msExcel.Worksheets.Item[1];
except
Result := false;
end;
//开始从EXCEL文件读取相关的信息 try
Application.ProcessMessages;
for i := 1 to MsExcelWorkSheet.Rows.Count do
begin
New(FASN2);
FASN2.In_Stock_No := trim(MsExcelWorkSheet.Range['B1'].Value);
FASN2.MAIN_FLG := trim(MsExcelWorkSheet.Range['A' + IntToStr(i)].Value);
FAsn2List.Add(FASN2);
//在这里可以调用adoquery.append代码
end;
Result := true;
finally
MsExcel.WorkBooks.Close;
end;
MsExcel.Quit;
OpenDialog1.Free;
end;
-----------
既然数据库中有表book,那只要增加 adoquery,datasource,dbgrid这几个控件,并设置好它们的属性就
可以了.2.button2:"批量插入到数据库中"的关键代码 --------------var
v_str:string;
begin
v_str:='insert into t select * from book';
with adoquery1 do
begin
close;
sql.clear;
sql.add(v_str);
execsql;
if rowsaffected >0 then
showmessage('插入成功!')
else
showmessage('插入失败!');
end;
end;
2.button2:"批量插入到数据库中"的关键代码 谢谢大家!
begin
//以下为范例,没有处理数据输入错误检查的问题
Append;
FieldByName('ID').Value := Edit1.Text;
FieldByName('BookName').Value := Edit2.Text;
FieldByName('Price').Value := Edit3.Text;
Post;
end第二个问题应该是涉及前台数据集问题,我猜你的意思应该是先在DBGrid1中存放N条记录,但不要即时存入数据库中,如果是此原因,你不应该使用TADOQuery组件,而应该使用TClientDataSet -> TDataSource -> TDBGrid,关于TClientDataSet的使用方法,你可以用"ClientDataSet1.CreateDataSet"作为关键上网学习一下用法,至于Button2Click中的代码,范例如下:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
cds: TADOQuery;
begin
cds := TADOQuery.Create(nil);
try
cds.Connection := Self.ADOConnection1;
cds.SQL.Text := 'Select * From TABLENAME Where ID=0';
cds.Open;
with ClientDataSet1 do
begin
First;
while not Eof do
begin
//此处范例没有考虑用户输入重复ID的问题
cds.Append;
cds.FieldByName('ID').Value := FieldByName('ID').Value;
cds.FieldByName('BookName').Value := FieldByName('BookName').Value;
cds.FieldByName('Price').Value := FieldByName('Price').Value;
cds.Post;
Next;
end;
end;
finally
FreeAndNil(cds);
end;
end.或许其它看客有更好的做法,欢迎分享。
//excel 读到 dbgridvar
str:string;
begin
str:='select * from opendatasource(''microsoft.jet.oledb.4.0'',''data source="文件路径";user id=admin;password=;extened properties=excel 5.0'')...[sheet1$]';
adoquery.close;
adoquery.sql.clear;
adoquery.sql.add(str);
adoquery.active:=true;
adoquery.open;
end;//dbgrid 导入数据表var
str:string;
begin
str:='select * into t from opendatasource(''microsoft.jet.oledb.4.0'',''data source="文件路径";user id=admin;password=;extened properties=excel 5.0'')...[sheet1$]';
with adoquery do
begin
close;
sql.clear;
sql.add(str);
execsql;
if rowsaffected>0 then
showmessage('插入成功')
else
showmessage(插入失败);
end;
end;
首先我们把各个连接做好,TADOConnection连接数据库,TADOQuery连接TADOConnection,TDataSetProvider连接TADOQuery,TClientDataSet连接TDataSetProvider,TDataSource连接TClientDataSet,TDBGrid连接TDataSource,然后,我们用TADOQuery查出数据,TDBGrid会自己显示数据:
button1:
with ClientDataSet1 do
begin
//以下为范例,没有处理数据输入错误检查的问题
Append;
FieldByName('ID').Value := Edit1.Text;
FieldByName('BookName').Value := Edit2.Text;
FieldByName('Price').Value := Edit3.Text;
Post;
end;
button2:
if ClientDataSet1 .State in [dsinsert,dsedit] then
ClientDataSet1 .Post;
if (ClientDataSet1 .ChangeCount > 0) then
begin
if CDS_ClientDataSet1 .ApplyUpdates(-1)>0 then
begin
showmessage('保存失败,请检查是否有重复数据!!!');
exit;
end
else
begin
showmessage('保存成功!!');
end;
end;
非常感谢你的回帖,我使用您给我的代码时,提示:clentdataset1:cannot perform this operation on a closed dataset.
能不能把你的源程序发给我,[email protected]
不胜感激!
请大家再帮忙看看,分一定送上。