mssql server 2k + d7(update1)
原系统:tdatabase + tquery + tdataprovider -> tclientdataset
一切运行正常,且事务没有问题最近修改服务端:tsqlconnection + tsqlquery + tdataprovider -> tclientdataset
竟然出现 tsqlconnection 启动事务失败 原有代码几乎未变过,只是换成了用dbExpress(dbexpmss.dll版本:7.1.1523.17956)控件,且给出的错误提示是一片空白,也不知道是什么错误。
部分代码如下: //0保存成功,1事务中,2保存失败
result := 2; //保存失败
if (count = 0) or (SQLCon.Connected = false) then
exit;
if SQLCon.InTransaction then
begin
result := 1; //showmessage('事务中!');
exit;
end
else begin
alst := tstringlist.create;
alst.text := dspnames;
try
try
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SQLCon.StartTransaction(Td); //运行到这里产生错误
for i := 0 to alst.count - 1 do
begin
dspobj := Providers[alst[i]];//self.FindComponent(alst[i]); //Providers[alst[i]];
if (dspobj<>nil) and (dspobj is TDatasetprovider) then
begin
bResolveToDataSet := TDataSetProvider(dspobj).ResolveToDataSet;
TDataSetProvider(dspobj).ResolveToDataSet := false;
if dspobj is TmyDataSetProvider then
TmyDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount)
else
TDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount);
TDataSetProvider(dspobj).ResolveToDataSet := bResolveToDataSet;
if errcount > 0 then
begin
SQLCon.Rollback(Td);
exit;
end;
end
else begin //找不到对应的dsp,保存失败
SQLCon.Rollback(Td);
exit;
end;
end;
SQLCon.Commit(Td);
result := 0;
except
if SQLCon.InTransaction then
SQLCon.Rollback(Td);
end;
finally
alst.free;
end;
end;
原系统:tdatabase + tquery + tdataprovider -> tclientdataset
一切运行正常,且事务没有问题最近修改服务端:tsqlconnection + tsqlquery + tdataprovider -> tclientdataset
竟然出现 tsqlconnection 启动事务失败 原有代码几乎未变过,只是换成了用dbExpress(dbexpmss.dll版本:7.1.1523.17956)控件,且给出的错误提示是一片空白,也不知道是什么错误。
部分代码如下: //0保存成功,1事务中,2保存失败
result := 2; //保存失败
if (count = 0) or (SQLCon.Connected = false) then
exit;
if SQLCon.InTransaction then
begin
result := 1; //showmessage('事务中!');
exit;
end
else begin
alst := tstringlist.create;
alst.text := dspnames;
try
try
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SQLCon.StartTransaction(Td); //运行到这里产生错误
for i := 0 to alst.count - 1 do
begin
dspobj := Providers[alst[i]];//self.FindComponent(alst[i]); //Providers[alst[i]];
if (dspobj<>nil) and (dspobj is TDatasetprovider) then
begin
bResolveToDataSet := TDataSetProvider(dspobj).ResolveToDataSet;
TDataSetProvider(dspobj).ResolveToDataSet := false;
if dspobj is TmyDataSetProvider then
TmyDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount)
else
TDataSetProvider(dspobj).ApplyUpdates(deltas[i], 0, errcount);
TDataSetProvider(dspobj).ResolveToDataSet := bResolveToDataSet;
if errcount > 0 then
begin
SQLCon.Rollback(Td);
exit;
end;
end
else begin //找不到对应的dsp,保存失败
SQLCon.Rollback(Td);
exit;
end;
end;
SQLCon.Commit(Td);
result := 0;
except
if SQLCon.InTransaction then
SQLCon.Rollback(Td);
end;
finally
alst.free;
end;
end;
但是通过sql server的事件探测器观察,在执行提交数据的方法之前是没有事务被挂起的,而且使用TDataBase就没有问题,怎么会这样呢?高手们出出手吧
说明一下:
TClientdataset也是调用DataSetProvider的applyupdate方法,我的更新是直接调用DataSetProvider来更新,应该不存在必须使用TClientDataSet或者TSimpleDataSet的问题。
在网上找了一些资料,说是SQL Server2000不支持多事务(这种表述好像有误),大意是TSQLConnection.MultipleTransactionsSupported连接SQL Server2000永远都是false,SQL 2005好像就没有这问题(没试过),你必须保证你的程序对每次对数据库操作产生的事务都提交完整,否则启动失败。事实上复杂一点的查询语句都会产生一些隐藏的事务,而这些事务有时候是不会立刻自动提交的,没办法,只有换了Ado,希望下次环境满足了可以继续用这个好东东谢谢关注,只有你一个,分全给你了,呵呵