如何一次插入多条记录?(80分)

  • 主题发起人 主题发起人 xyusun
  • 开始时间 开始时间
X

xyusun

Unregistered / Unconfirmed
GUEST, unregistred user!
用insert 只能一次插入一条新记录!现在我需要在用户按下确认健一次插入多条纪录。
并且,要么完全成功插入,要么,全都没有插入!我该如何实现?请想细指点一下!最好
有源代码!
 
看你用什么数据库了,有的数据库不支持多记录insert.
insert into table (field1,field2,field3)
values(a1,a2,a3,b1,b2,b3,c1,c2,c3) 就可以的。
或是
insert into table (field1,field2,field3)
values的值为一个结果集 。
 
insert into tablename(field1,field2...) (select *** from ** where ***)结果集
这样就可以
然后加上事务处理就可以了
出错就回滚rollback
成功就commit
 
看看我的代码
procedure TForm1.BitBtn1Click(Sender: TObject);
var STableName,ssdbfile: string;
begin
STableName:=mydm.dataform.Table1.TableName;
ssdbfile:=stablename;
STableName:=copy(STableName,pos('_',StableName)+1,
pos('.',StableName)-pos('_',StableName)-1);
ssdbfile:=copy(ssdbfile,1,pos('.',ssdbfile)-1);
with mydm.dataform.Query1do
begin
SQL.Clear;
SQL.Add('insert into '+trim(edit1.text));
SQL.Add('select name,address,post from');
SQL.Add(STableName+' where name in (');
SQL.Add('select name from '+ssdbfile);
SQL.Add('where wget = 1)');
try
Prepare;
ExecSQL;
Except
showmessage(Sql.text);
end;
end;
end;
 
try
AdoConnection.begin
Trans;
for I := 1 to Countdo
begin
AdoCommand.CommandType := cmdText;
AdoCommand.CommandText := 'insert into tablename(f1,f2) '+
'values(:v1,:v2)';
AdoCommand.Parameters.ParamValue['v1'] := ...
AdoCommand.Parameters.ParamValue['v2'] := ...
end;
AdoConnection.CommitTrans;
except
AdoConnection.Rollback;
end;
 
“完全成功插入,要么,全都没有插入”这是典型的事物处理,那么在
开始插的时候调用“begin
Trans”或“begin
Transaction”,结束的
时候调用“CommitTrans”,出错的话就调用“RollbackTrans”。
 
insert into ....
select .... from .....
 
我用的是sql sever 7
 

SQL SERVER 7都支持
 
那么如何对多条记录修改呢?
 
to 萧月禾
你的程序中的'insert into tablename(f1,f2) '为什么是f1,f2两个表?
 
实践后的问题:
try
AdoConnection1..begin
Trans;
with stringgrid1do
begin
for I := 1 to colcount-1 do
for j := 1 to rowcount-1do
begin
clientdataset1.CommandText:= 'insert into fang '+
'values(:v1,:v2,:v3,:v4,:v5)';
clientdataset1.Params.ParamValues['v1'] := edit1.Text;
clientdataset1.Params.ParamValues['v2'] := j;
clientdataset1.Params.ParamValues['v3'] := i;
clientdataset1.Params.ParamValues['v4'] := cells[i,j];
end;
AdoConnection1.CommitTrans;
except
AdoConnection1.Rollback;
end;
end;
问题1:我的程序是三层结构。服务器端用adoconnection,adodataset,datasetprovider;
客户端用dcomconnection,clientdataset,
问题是:dcomconnection没有与事务有关的操作。我该怎么办?
 
事务+updatesql
 
AdoConnection1不是已经实现事务了吗?干吗还要在dcomconnection,clientdataset,实现
事务有关的操作。在服务器端实现事务就是为了安全以及多层数据库的实现嘛!
 
to 初学者1
能在解释详细一点吗?
 
xyusun,数据库事务是在TDATABASE或TAdoConnection之类的数据库连接器上实现的。
我在三层中基本上是不用clientdataset的,而是在服务器端定义方法,手工编程实现
业务逻辑(事务就在此时实现),然后客户端用APPSERVER接口调我的方法(客户端根本
就不需要知道数据库的情况)。
 
我用bde做的
正象savenight所说的,AdoConnection1不是已经实现事务了吗?干吗还要在dcomconnection,clientdataset,实现
事务有关的操作。
 
to xyusun:
f1,f2是表tablename的两个字段呀!!!!!
 
我说2句:
你可以使用ADO提供的BatchUpdata模式
不过使用BatchUpdata模式要注意一些必要的设定:
CurosrType 为 KeySet或 Static
LockType 为 BatchOptimistic
Sql命令必需是Select
建议CursorLocation 为 clUseClient
操作:
1:你先将一个DateSet连接到数据库,用Select将数据装入DateSet,(可以是多表)
2:你可以对该DateSet的数据进行有关操作(添加,删除,修改)
3:然后你就可以用UpdateBatch,CancelBatch来更新数据(有一些参数自己看帮助吧)
UpdateBatch模式提供了很多有用的函数,属性用空的时候好好看看有好处的
 
后退
顶部