如何一次提交好几条纪录,用jsp,300分 (100分)

  • 主题发起人 主题发起人 llk
  • 开始时间 开始时间
L

llk

Unregistered / Unconfirmed
GUEST, unregistred user!
我想往表里提交多条纪录,但又不想一次次的提交,那样太慢,想一次都录进去,该怎么办
 
用事务不可以么?
 
设置Query的CatchUpdate=True
然后在提交的时候这样写:
Query1.ApplyUpdates ;
如果涉及多个表的。
可以开始事务:
procedure TForm1.FormCreate(Sender: TObject);
begin
try
Database1.StartTransaction;
Query1.ApplyUpdates;
Query2.Post
...
Database1.Commit;
except
if Database1.InTransaction then
Database1.Rollback;
end;
end;
对于AdoQuey,有相应事件:
ADOConnection1.begin
Trans;
ADOConnection1.CommitTrans;
ADOConnection1.RollbackTrans;
 
用事务嘛
亏delphi里面的事务处理这么好
 
没错,就是用事务。
或者用UpdateSQL这个控件。
 
看下面的代码:
if(VerifyInputData()=false) then
exit;
with DataModuleNewdo
begin
QueryInsert.Close;
QueryInsert.SQL.Clear;
strSQL := GetInitCensorSQLstring('商品入库单', EditBillCode.Text , RxLkEditSaleDepartment.Text );
Edit2.Text :=strSQL;
QueryInsert.SQL.Add(strSQL);
QueryPublic.Close;
QueryPublic.SQL.Clear;
sPublicSQL :=GetPublicSQLstring();
QueryPublic.SQL.Add(sPublicSQL);
GetDetailSQLstring();
//得到入库单详细表的 insert SQL语句
// showmessage(sDetailSQL[1]);
// exit;
Database1.StartTransaction;
try
{try to write the updates to the database};
QueryInsert.ExecSQL;
QueryPublic.ExecSQL;
for i:= 1 to nTotalDetailRowdo
//请看, 这是多条记录提交
begin
QueryDetail.Close;
QueryDetail.SQL.Clear;
QueryDetail.SQL.Add(sDetailSQL);
QueryDetail.ExecSQL;
end;
Database1.Commit;
{on success, commit the changes};
except
Database1.Rollback;
{on failure, undo the changes};
raise;
// ShowMessage('您录入的数据有错! 可能是输入的单据编号与以前的输入重复了。');
exit;
end;
sLastBillCode:=EditBillCode.Text ;
Rxlabel1.Caption :='本单已提交';
Rxlabel1.Font.Color :=clRed;
ShowMessage('数据提交成功!');
QueryInsert.Close;
end;
 
如果你用的是MS SQL的话,它一次可以执行多条语句的
应该没有问题的
 
大家的意思是用activeform吗?我是用jsp,另外,我的数据库是oracle
 
首先要 conn.setAutoCommit(false);
当不是AutoCommit的时候,你执行 conn.commit() 才提交一次事务
开始一个事务是不需要你写什么语句的,只要在rollback或者commit之后执行一条DML命令
就自动开始事务的。这个与oracle完全一致
 
除了事务之外还可以设定批量更新
A D O的B a t c h U p d a t e功能和B D E / I D A P I的C a c h e d U p d a t e非常类似。它的工作原
理就是当A D O从数据源取得数据之后,客户端对于所有数据的修改都暂时储存在
客户端的缓存中,而不是立刻更新回数据源中。而当客户端决定要把所有的修改
更新回数据源时,才调用A D O的方法,把所有的修改更新回数据源中。
使用B a t c h U p d a t e方法来处理数据的好处是客户端和数据源之间不会产生密切
的互动,因此可以降低数据源的负荷。此外也可以减少网络的R o u n d t r i p,这在拥
有大量客户端的应用系统中是非常有帮助的。此外由于B a t c h U p d a t e是把客户端对
于数据的修改暂时储存在客户端内存中,因此它对于数据的修改动作非常快速,只
在最后把所有的修改更新回数据源时才需要比较多的时间。不过使用B a t c h U p d a t e
也有一些问题,那就是程序员必须撰写较多的程序代码来处理数据更新错误的情形。
这是因为当客户端在修改数据时,可能已经有其他的用户改变了数据源中的数据,
因此当客户端把修改的数据更新回数据源时便可能会发生数据冲突或是错误的情
形。所以当程序员在使用B a t c h U p d a t e时,一定要搭配错误处理程序代码,才能够
撰写出安全坚固的应用程序。在本书稍后的章节中会讨论如何在A D O应用程序中
处理错误的情形。
要使用A D O的B a t c h U p d a t e功能,程序员必须在A D O E x p r e s s组件中进行一些
必要的设定,才能够让A D O进入B a t c h U p d a t e的模式。下面就是进入B a t c h U p d a t e模
式的必要设定:
•
设定C u r s o r Ty p e为K e y S e t或S t a t i c。
•
设定L o c k Ty p e为B a t c h O p t i m i s t i c。
•
执行的S Q L命令必须是S e l e c t。
除此之外,C u r s o r L o c a t i o n也是程序员必须考虑的设定。虽然在M i c r o s o f t的文
件中说明, B a t c h U p d a t e可以使用S e r v e r-Side Cursor或Client-Side Cursor。但是,
如果使用B a t c h U p d a t e再搭配S e r v e r-Side Cursor ,那么不但无法使用稍后介绍的
B r i e f c a s e模型,在执行效率上也不好。这在第4章中会详细讨论。因此建议各位,
如果要使用B a t c h U p d a t e模式,那么最好使用Client-Side Cursor。因此我们可以加
入第4个步骤:
设定C u r s o r L o c a t i o n为c l U s e C l i e n t。
当A D O进入B a t c h U p d a t e模式时,所有对于数据的修改都是暂存在客户端中。
当客户端决定把数据真正更新回数据源中时,可以调用TA D O D a t a S e t 、
TA D O Q u e r y、TA D O Ta b l e或TA D O S t o r e d P r o c组件的U p d a t e B a t c h方法。而
U p d a t e B a t c h方法接受一个参数,这个参数代表客户端要把哪些修改的数据更新回
数据源中。下面是U p d a t e B a t c h方法的原型:
procedure UpdateBatch(AffectRecords: TAffectRecords = arAll);
U p d a t e B a t c h方法的参数说明如下:
选项常数意义
a r C u r r e n t 只把目前记录的修改更新回数据源之中
a r F i l t e r e d 只把符合过滤条件的数据的修改更新回数据源之中
a r A l l 把所有数据的修改更新回资来源之中
a r A l l C h a p t e r s 更新所有被影响到的chapters (ADO chapters)
因此在A D O 中B a t c h U p d a t e可以让用户指明要更新的修改数据种类。而
U p d a t e B a t c h的内定参数是a r A l l,表示要把客户端所有修改的数据更新回数据源中。
A D O的B a t c h U p d a t e模式在使用上非常简单,但是功能却非常强大,而且可以衍生
出其他的应用,现在先让我们从基本的应用程序开始,说明如何使用A D O的
B a t c h U p d a t e功能。
 
你没见人家是用在jsp吗
 
用updatesql啊,使query或adoquery的UpdateObject指向它,当然要设置updatesql相关
SQL语句,并且要求updatesql对应的表有key field。
 
你可以这样用一个变通的方法。
如果你想输入5个userName,你可以在form里面使用5个input. 名字分别叫userName1,userName2...
userName5,还有比如score1...score5表示分数。
然后又一个input,totalCount,value=5,来指出一共有5个。
接受form的servlet或者jsp遍历
con.setAutoCommit(false);
preparedStatement ps = con.preparedStatement("insert into user values(?,?)");
for (int i=1;i<totalCount+1;i++)
{
ps.setString(1,(String)request.getParameter("userName"+i));
ps.setInt(2,Integer.parseInt((String)request.getParameter("score"+i)));
}
这样就行了。
注意我的代码只是示意。
 
oracle参数不是用
insert into user values(?,?)
而用:
insert into user values(:1,:2)
 
怎么不是?我每天都在用oracle。
 
[red]JDBC 2.0[/red]
// turn off autocommit
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO employees VALUES (1000, 'Joe Jones')");
stmt.addBatch("INSERT INTO departments VALUES (260, 'Shoe')");
stmt.addBatch("INSERT INTO emp_dept VALUES (1000, 260)");
// submit a batch of update commands for execution
int[] updateCounts = stmt.executeBatch();
===========================================================================
1. If the value of an array entry is greater than or equal to zero, then
the batch
element was processed successfully and the value is an update count indicating
the number of rows in the database that were effected by the element’s
execution.
2. A value of -2 indicates that a element was processed successfully, but that the
number of effected rows is unknown.
===========================================================================
PreparedStatements
// turn off autocommit
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(
"INSERT INTO employees VALUES (?, ?)");
stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();
stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();
// submit the batch for execution
int[] updateCounts = stmt.executeBatch();
=============================================================================
Maybe, it can help u.
 
把你要提交的多条记录用一个特定的方式组成一个String 一次性提交到服务器端,再用循环
分开加到数据库里。
 

Similar threads

D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
D
回复
0
查看
840
DelphiTeacher的专栏
D
D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
后退
顶部