背景:使用_ConnectionPtr m_pConnection; //ADO连接变量指针
_RecordsetPtr m_pRecordset;
进行连接数据库文件和对数据库的读、写等,一般平均每隔5分钟和1小时向数据库添加数据。1、我先在程序运行的初始化中使用m_pConnection连接数据库文件,在程序运行的过程中长期保存连接数据库状态,在要向数据库添加数据时使用m_pRecordset.open打开数据库中的表(平均每隔5分钟和1小时),并对表添加数据(还要判断表是否存在,不存在则创建表),添加完之后使用m_pRecordset->Close();
m_pRecordset.Release();。
疑问:在长时间(半年以上)程序运行过程中,一直保持者连接数据库是否会有影响?
各位一般操作数据库是怎么样的,是每次要操作表时在去用m_pConnection连接数据库,用完就关闭。2、在以上的情况下我还要写一个软件需要读取同一个数据库,这个软件一般在运行一两个小时就会关闭。疑问:如果在这个软件同样使用上面的方法读取数据,是否会出现冲突?有什么好的方法吗?再次先谢谢给位的指教!accessado疑问
_RecordsetPtr m_pRecordset;
进行连接数据库文件和对数据库的读、写等,一般平均每隔5分钟和1小时向数据库添加数据。1、我先在程序运行的初始化中使用m_pConnection连接数据库文件,在程序运行的过程中长期保存连接数据库状态,在要向数据库添加数据时使用m_pRecordset.open打开数据库中的表(平均每隔5分钟和1小时),并对表添加数据(还要判断表是否存在,不存在则创建表),添加完之后使用m_pRecordset->Close();
m_pRecordset.Release();。
疑问:在长时间(半年以上)程序运行过程中,一直保持者连接数据库是否会有影响?
各位一般操作数据库是怎么样的,是每次要操作表时在去用m_pConnection连接数据库,用完就关闭。2、在以上的情况下我还要写一个软件需要读取同一个数据库,这个软件一般在运行一两个小时就会关闭。疑问:如果在这个软件同样使用上面的方法读取数据,是否会出现冲突?有什么好的方法吗?再次先谢谢给位的指教!accessado疑问
解决方案 »
- Unix移植到windows read()和write方法问题
- 谁来帮帮忙! 关于win ce程序开发得问题!
- SQLGetInstalledDrivers
- 当Combo Box输入的值改变时自动更新列表中的内容怎么做?类似于金山词霸
- SQLserver2000查询最新增加的20条数据的语句怎么写?
- 求车牌照片!越多越好, 用于做车牌识别。。。得到一定给分!!
- [关键字 深圳赛格 电脑配置]
- 我的程序知道一个应用程序的句柄,如何使该应用程序得到焦点?
- 谁能提供《vc++编程高手》光盘所附源代码,300百分等着你~~
- 想在控件里实现点击,在点击处出现浮动条,浮动条中是控件的信息。怎么做?急急急急急急
- 如何用VC跨平台、跨主机访问数据库?
- VC++ 6.0中使用ADO,数据库为ACCESS。在查询模块中报错。
一般没影响,但得考虑系统问题所造成连接中断,因此既然至少5分钟操作数据库,不如操作完后就断开,用时再连接,这样更安全。
2。
这各情况就得用共享方式打开数据库,ACCESS数据库是独占式,所以共享打开能如成功或有效,你得试试了,就是一个程序保持连接并打开一个表,另一个程序再进行连接这个数据库并打开同样的一个表看是否成功及读出数据
m_pRecordset.Release();。
疑问:在长时间(半年以上)程序运行过程中,一直保持者连接数据库是否会有影响?
各位一般操作数据库是怎么样的,是每次要操作表时在去用m_pConnection连接数据库,用完就关闭。//实际表明,影响不大,但正如LS说的,需要的时候再打开,安全些;
//m_pRecordset.Release();m_pRecordset是个智能指针,一般不需要你去Release();。其析构函数会字段Release;2、在以上的情况下我还要写一个软件需要读取同一个数据库,这个软件一般在运行一两个小时就会关闭。
连接串中有个属性值,可以指定访问属性,可以指定
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Data\Northwind\NORTHWINDA.MDB;Mode=Share Deny None;Persist Security Info=False
您的意思是每次创建m_pConnection和m_pRecordset智能指针,只不用时只要调用close()就行了,然后他们会自动调用析构函数中的release()了?那我们还要不要把指针赋值为NULL?
还有:
在我自己写打开数据库表的成员函数中时:
在使用 m_pRecordset->Open()之前我使用
if(m_pRecordset->State)
m_pRecordset->Close();
但发现在使用时m_pRecordset->State时出现错误,调试发现m_pRecordset的值为null,难道使用Open之前不要判断下数据集是否关闭。
代码:bool CAdoCZAccess::OpenTable(_ConnectionPtr mpdb, LPCTSTR lpstrExecc)
{
if(m_pRecordset != NULL)
{
if(m_pRecordset->State)
m_pRecordset->Close(); ///如果已经打开了连接则关闭它
}
if(m_pConnection == NULL)
m_pConnection = mpdb;
//////////////打开本地Access库DrawYun.mdb////////////////
HRESULT hr = S_OK;
try
{
m_pRecordset.CreateInstance(__uuidof( Recordset )); //创建实例
CString strSql;
strSql.Format(_T("SELECT * FROM %s"),lpstrExecc);
m_pRecordset->Open((_variant_t)strSql,
m_pConnection.GetInterfacePtr()/*获取库接库的IDispatch指针*/,
adOpenStatic,
adLockOptimistic,
adCmdText);//执行SQL语句,得到记录集,
}
catch(_com_error e) ////捕捉异常
{
// AfxMessageBox(_T("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!"));
// return FALSE; CString strError;
strError.Format( _T("连接数据库发生异常! \r \n错误信息:%s"), e.ErrorMessage( ) ); //显示错误信息
AfxMessageBox(strError);
return FALSE;
}
return m_pRecordset != NULL && m_pRecordset->GetState()!= adStateClosed;
}
同时谢谢hdg3707 和youyingbo 的回答,看来要把长连接改成短连接
if(m_pRecordset->State)
m_pRecordset->Close();
==>
if(m_pRecordset!=NULL))//忘记了要不要加IUnknown转换:(IUnknown*)NULL,你自己试一下吧
if(m_pRecordset->State)
m_pRecordset->Close();
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access\\DrawYun.mdb",
"","",adModeUnknown);m_pRecordset->Open((_variant_t)strSql,
pApp->m_pConnection.GetInterfacePtr()/*获取库接库的IDispatch指针*/,
adOpenStatic,
adLockOptimistic,
adCmdText);//执行SQL语句,得到记录集, 同时在请教各位一个问题: 在一个函数的m_pRecordset的创建和打开数据库表之后,如果要进行m_pRecordset.close(),这一句放在try里还是catch里或者在try catch外, 注:是在一个函数里。
{
_RecordsetPtr m_pRecordset;////记录集
m_pRecordset.CreateInstance(__uuidof( Recordset )); //创建实例
CDrawYunApp * pApp =(CDrawYunApp *)AfxGetApp();
try
{
if(m_pRecordset->State)
{
m_pRecordset->Close();
} m_pRecordset->Open((_variant_t)strSql, pApp->m_pConnection.GetInterfacePtr(), adOpenStatic,adLockOptimistic,adCmdText);//执行SQL语句,得到记录集,
//省略数据添加操作///////// m_pRecordset->Close();
m_pRecordset.Release();//释放智能指针,相当于m_pConnection=NULL;
m_pRecordset = NULL; }
catch(_com_error &e)
{
AfxMessageBox(e.Description());
// return FALSE;
}
if(m_pRecordset != NULL)
{
if(m_pRecordset->GetState() == adStateOpen)
{
m_pRecordset->Close();
m_pRecordset = NULL;
}
} return TRUE;}我这个是在几个不同的进程间进行,我只想到在A进程使用hEvent = CreateEvent(NULL, false, false, _T("MyEvent")),操作数据库表时再进行SetEvent(hEvent),B、C进程使用WaitForSingleObject(hEvent,INFINITE);来进行等待空闲,这种方法可行的高吗,或您有其它更好的方法?
网上看到进程间互斥临界区编程
//临界区定义
CRITICAL_SECTION MSGSND_CS;
//初始化临界区
InitializeCriticalSection(&MSGSND_CS);
//临界区使用
EnterCriticalSection(&MSGSND_CS);
LeaveCriticalSection(&MSGSND_CS);这是不是只要在一个进程中使用就行了,即在进程1向数据库的表保存内容前使用EnterCriticalSection(&MSGSND_CS);保存完之后使用LeaveCriticalSection(&MSGSND_CS);进程2什么也不添加