多线程打开ACCESS数据库的奇怪问题,在主线程可以打开,重开县城就不能打开

haichao_ji 2004-01-09 10:35:03
我现在在程序里遇到一个问题,
由于删除数据库的数据量比较大,所以想开一个线程单独删除,但是在新的线程里单步跟踪的时候数据库却根本不能打开,出问题的那句是hr = db.Open(_T("Microsoft.Jet.OLEDB.4.0"), &dbinit);每次返回的hr都不为0。

但是如果我不是单独开一个线程,则连接删除都没有问题。有人遇到过这样的问题吗?是access对多线程的支持有问题还是因为我的参数不对?下面是我的代码


HRESULT hr;
CDataSource db;
CDBPropSet dbinit(DBPROPSET_DBINIT);

dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true);
dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR(""));
dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("Admin"));
char PathName[255];
GetModuleFileName( AfxGetInstanceHandle(), PathName,sizeof( PathName ) );
char *a,*b;
a = b = PathName;

while(b)
{
b=strchr(a+1,'\\');
if(b) a=b;
}
*a='\0';
CString temp=PathName;
temp+="\\playback.mdb";//我的数据库
dbinit.AddProperty(DBPROP_INIT_DATASOURCE,temp);
dbinit.AddProperty(DBPROP_INIT_MODE, (long)16);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, OLESTR(""));
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
//dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
hr = db.Open(_T("Microsoft.Jet.OLEDB.4.0"), &dbinit);
if (FAILED(hr))
{
AfxMessageBox("Can't connect to the database");
return hr;
}
...全文
91 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jizhiyuan 2004-01-09
  • 打赏
  • 举报
回复
新线程里要初始化
CoInitialize(NULL);
wim 2004-01-09
  • 打赏
  • 举报
回复
因为ACCESS不支持,你没有注意到打开一个 filename.mdb 文件的同时,当前目录下,会多一个filename.ldb的文件,该“*.ldb”文件,就是Lock Mdb文件的,不能用其他的线程或者进程读已经打开的.mdb文件!!!!

我认为如此。。。。。。。
haichao_ji 2004-01-09
  • 打赏
  • 举报
回复
为什么我直接删除的时候可以打开数据库,而新线程就不能打开?

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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