急!!!多线程访问数据库出错,哪位大侠出手相救! ( 积分: 200 )

  • 主题发起人 主题发起人 bamboowzm
  • 开始时间 开始时间
B

bamboowzm

Unregistered / Unconfirmed
GUEST, unregistred user!
多线程动态调用一个DLL(可能调用多次),将主程序的一个过程函数(该过程函数进行了数据库的记录保存)地址传递DLL,在DLL进行多次使用改过程函数。
如果涉及到数据库处理比较多的时候,就会莫名其妙的报错误。数据库的表也比较容易被破坏(Paradox数据库)。

另外,如果多次动态调用同一个DLL,好像DLL中的全局变量的内存地址是一样的,不知道怎样处理才能实现全局变量在每个DLL中都有独立的对象。
 
能把报错内容和情形说的具体一点吗?
 
不太清楚你说的问题,不过多线程调用或操作数据库的时候,我都在前面用CoInitialize(nil);初始化,否则就会报错。
你可以试试
 
因为没有什么规律,只是肯定和数据库有关系
 
type
TQueryThread=class(TThread)
private
FHandle:HWND;
FHasResult:Boolean;
FQuery:TAdoQuery;
procedure QueryExecute;
procedure QueryOpen;
protected
procedure Execute;override;
public
constructor Create(AHandle:HWND; AdoQuery:TAdoQuery; HasResult:Boolean);
end;

implementation

constructor TQueryThread.Create(AHandle:HWND;AdoQuery: TAdoQuery; HasResult: Boolean);
begin
inherited Create(True);
FreeOnTerminate:=True;
FHandle:=AHandle;
FQuery:=AdoQuery;
FHasResult:=HasResult;
Resume;
end;

procedure TQueryThread.Execute;
begin
if FHasResult then
QueryOpen
else
QueryExecute;
end;

procedure TQueryThread.QueryExecute;
begin
try
FQuery.ExecSQL;
PostMessage(FHandle, WM_ThreadDone, Self.ThreadID,0);
except
on E:Exception do
PostMessage(FHandle,WM_ThreadDone, Self.ThreadID,MaxInt);
end;
end;

procedure TQueryThread.QueryOpen;
begin
try
FQuery.Open;
PostMessage(FHandle, WM_ThreadDone, Self.ThreadID,0);
except
on E:Exception do
PostMessage(FHandle,WM_ThreadDone, Self.ThreadID,MaxInt);
end;
end;
觉得这样子很好
 
to asksomeone:
你的这个方法,我比较认同,但是,我操作的是TTable,
with tab do
begin
try
open;
Append;
FieldByName('field1').AsInteger:=100;
...
Post;
except
close;
end;

不知道有何方法可以处理。
 
如果能写出个类似如
format('%.....",[pram1,pram2..])的接口就好办了
 
在Paradox上做多线程并发数据库操作?

即使是非要用文件型数据库,也建议楼主换成PostgreSQL吧
 
你加入QQ群:21142913
里面有你需要的答案
 
把操作部分加互斥不就行了,这样最安全.
 
var
CS:TRTLCriticalSection;

初始化:
initializeCriticalSection(cs);

独占
EnterCriticalSection(cs);
.....操作数据库

解除独占
LeaveCriticalSection(CS);
 
后退
顶部