高手请进

weekendW 2002-10-08 09:48:39
我有一程序包含了一个DataModul用来访问SQL数据库,另有4个线程使用它提供的接口访问数据库,DataModul包含了4个AdoConnection每个都有不同的用途,其中一个AdoconnectionA是用来访问数据库DataA的表TableA,另有一个StoreProdure控件StoreA通过AdoconnectionA来调用一个存储过程向TableA中插入一条记录,程序代码如下:
try
with self.storeA do
begin
参数附值
ExecProc
end
except
on E:Exception do
begin
FLastErrorMsg := '保数据错误,请退出再试' + E.message;
exit ;
end;

程序在运行很长一段时间后回出现以下错误:(程序日志)

2002-08-30 17:15:49 [保数据错误,请退出再试对象打开时,操作不被允许。]
2002-08-30 17:15:49 [保数据错误,请退出再试在异步运行时,操作不能被执行。]
2002-08-30 17:15:49 [保数据错误,请退出再试Access violation at address 1F45C2E1 in module 'msado15.dll'. Read of address 00000090]
2002-08-30 17:15:49 [保数据错误,请退出再试Access violation at address 1F451B43 in module 'msado15.dll'. Read of address 00000001]

请赐教!
...全文
42 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱编程的老五 2002-10-09
  • 打赏
  • 举报
回复
加锁也没有用的,加锁只是保证第一个使用的没有问题,但后面的使用就会出问题了.对数据库操作,如果不是对同表操作,则可同时进行,如果是对同表操作,则最好在线程里同步.这样做是确定没有问题的.另外你在更新记录时最好将操作包在一个事务里.(你用的应该是mssql吧)
weekendW 2002-10-09
  • 打赏
  • 举报
回复
事实上,我有三个adoconnection连接到一个数据库上了(这是由BDE改过来得,以前BDE使用一个Database时出错,后来改为多个没有问题),而且所有对数据库的访问都加锁了,使我感到困惑的是错误信息:对象打开时,操作不被允许,我认为这应该是多线程冲突应起的。但是我使用了lock啊
weekendW 2002-10-09
  • 打赏
  • 举报
回复
谢谢,我试试
hongqi162 2002-10-08
  • 打赏
  • 举报
回复
关注!
daniel007 2002-10-08
  • 打赏
  • 举报
回复
如果有多个进程同时访问数据库(多个连接),则可能造成存储的冲突,即第一个进程取了一笔数据,然后第二个进程修改了这笔数据中的某些值,那么第一个进程要将结果保存回去时就会产生错误。
爱编程的老五 2002-10-08
  • 打赏
  • 举报
回复
你是连接到一个数据库吗?为什么要用四个adoconnection连接呢?如果只连一个数据库,只需一个连接即可.你在线程中同步与数据库有关的操作即可,同步用synchronize.

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧