大哥哥大姐姐,救命呀
从提示来看:不能在已关闭的数据库上执行操作
但是我可以肯定数据库当时已经打开
唯一不敢肯定的就是下面这个事务提交,代码如下:
procedure TForm1.cxButton3Click(Sender: TObject);
var
SqlString:String;
begin
SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
with Query1 do
begin
if not Database1.InTransaction then
begin
Database1.StartTransaction;
try
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
Database1.Commit;
except
Database1.Rollback;
ShowMessage('数据提交失败');
end;
CommitUpdates;
end; end;end;
如果我不用事务提交,直接
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
程序通过,我怀疑我事务提交有问题,是不是?????????????????还有,我在delphibbs看有些网友讨论事务提交的数量,提出比较少的数据可以,如果数据量大的时候事务提交只是理论上行的通,速度受不了,是吗?
那如果一天的销售数据有10W条,我晚上进行汇总的时候要进行各种关联表的操作,数据量也很大,那不用事务提交用什么喃??????????
从提示来看:不能在已关闭的数据库上执行操作
但是我可以肯定数据库当时已经打开
唯一不敢肯定的就是下面这个事务提交,代码如下:
procedure TForm1.cxButton3Click(Sender: TObject);
var
SqlString:String;
begin
SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
with Query1 do
begin
if not Database1.InTransaction then
begin
Database1.StartTransaction;
try
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
Database1.Commit;
except
Database1.Rollback;
ShowMessage('数据提交失败');
end;
CommitUpdates;
end; end;end;
如果我不用事务提交,直接
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
程序通过,我怀疑我事务提交有问题,是不是?????????????????还有,我在delphibbs看有些网友讨论事务提交的数量,提出比较少的数据可以,如果数据量大的时候事务提交只是理论上行的通,速度受不了,是吗?
那如果一天的销售数据有10W条,我晚上进行汇总的时候要进行各种关联表的操作,数据量也很大,那不用事务提交用什么喃??????????
还有我的Query1.CatchUpdates:=True;
我还有什么地方没对,我无语了。
还有第2个问题谁知道???????????
procedure TForm1.cxButton3Click(Sender: TObject);
var
SqlString:String;
begin
SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid
from billaid,desk where ( billaid.deskid = desk.deskid ) and
( ( billaid.billkindid = '+'''0403'''+' ) ) )';
Close;
Sql.Clear;
Sql.Add(SqlString);
with Query1 do
begin
if not Database1.InTransaction then
begin
Database1.StartTransaction;
try
ExecSQL;
Database1.Commit;
except
Database1.Rollback;
ShowMessage('数据提交失败');
end;
CommitUpdates;
end;
end;
end;
能用demo库给我演示哈正确的也行呀
DB_Link.ADOC_DBLink.BeginTrans ; ////ADOC_DBLink 为AdoConnection控件
try
begin
DB_Link.ADOC_DBLink.CommitTrans ;
end;
except
DB_Link.ADOC_DBLink.RollbackTrans ;
Screen.Cursor:=crDefault;
AdoQ_base.EnableControls;
Application.MessageBox('基站信息统计表导入失败,',PChar(self.Caption), MB_OK + MB_ICONSTOP);
end;
var
SqlString:String;
begin
SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
if not Database1.InTransaction then
Database1.StartTransaction;
try
with Query1 do
begin
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
end;
except
Database1.Rollback;
ShowMessage('数据提交失败');
raise;
end;
Database1.Commit;
end;end;试试看
我这里有源码www.china-aroma.com/tiaozheng.rar
能用demo库给我演示哈正确的也行呀过了就给分
试一下:
procedure TForm1.cxButton3Click(Sender: TObject);
var
SqlString:String;
begin
SqlString:='update billaid set deptid=desk.deptid,cfnid=desk.cfnid from billaid,desk where ( billaid.deskid = desk.deskid ) and ( ( billaid.billkindid = '+'''0403'''+' ) ) )';
cxMemo3.Lines.Text:=SqlString;
with Query1 do
begin
DataBase1.Close;
DataBase1.Open;
Database1.StartTransaction;
try
Close;
Sql.Clear;
Sql.Add(SqlString);
ExecSQL;
Database1.Commit;
except
Database1.Rollback;
ShowMessage('数据提交失败');
end;
CommitUpdates;
end;end;
首先可以肯定当时Database1.Connected为True
以下为尝试:
1.我试过如果增加一个DBGrid DataSource链接好后,不用事务
with Query1 do
begin
Close;
Sql.clear;
Sql.add('select ...');
Open;
end;
-----------------------------程序正常
2.在原有程序基础上,不用事务直接Sql.add(SqlString)后ExecSql;
-----------------------------程序正常所以我认为问题应该出在事务提交上,语句问题不大,应该是有什么限制吧???????????我重新用原控件写了一个demo,高手帮忙看看,随便給我解释哈事务处理的一些限制也好
地址:www.china-aorma\test.rar
我记着好象是beginTransaction
条件语句里 Database1.InTransaction 数据库没有打开怎么判断???先打开数据库再操作