背景:使用_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疑问

解决方案 »

  1.   

    1。
    一般没影响,但得考虑系统问题所造成连接中断,因此既然至少5分钟操作数据库,不如操作完后就断开,用时再连接,这样更安全。
    2。
    这各情况就得用共享方式打开数据库,ACCESS数据库是独占式,所以共享打开能如成功或有效,你得试试了,就是一个程序保持连接并打开一个表,另一个程序再进行连接这个数据库并打开同样的一个表看是否成功及读出数据
      

  2.   

    你好,能把那个ado访问access数据库的代码发我学习下么?谢谢 邮箱:[email protected]
      

  3.   

    1、我先在程序运行的初始化中使用m_pConnection连接数据库文件,在程序运行的过程中长期保存连接数据库状态,在要向数据库添加数据时使用m_pRecordset.open打开数据库中的表(平均每隔5分钟和1小时),并对表添加数据(还要判断表是否存在,不存在则创建表),添加完之后使用m_pRecordset->Close();
                                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
      

  4.   

    1、
    您的意思是每次创建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 的回答,看来要把长连接改成短连接
      

  5.   

    NULL要不要设你自己决定,反正也没有坏处,只是让大妈大点而已
     if(m_pRecordset->State)   
             m_pRecordset->Close();
    ==>
    if(m_pRecordset!=NULL))//忘记了要不要加IUnknown转换:(IUnknown*)NULL,你自己试一下吧
     if(m_pRecordset->State)   
             m_pRecordset->Close();
      

  6.   

    今天有时间再两个进程中对同一个数据库的同一表操作居然没问题,具体:进程1连接数据库并打开其中的表A进行写数据操作时打上断点停在这里,再再进程2连接同一数据库的同一表进行读操作,居然读取成功了,可我没用共享方式打开,难道是默认共享?我的连接数据库和表的代码如下:
     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外,  注:是在一个函数里。
      

  7.   

    嗯请我加的你看看有什么问题:int a()
    {
       _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);来进行等待空闲,这种方法可行的高吗,或您有其它更好的方法?
      

  8.   

    看了临界区的使用,还有点疑问请教您:
    网上看到进程间互斥临界区编程 
    //临界区定义
    CRITICAL_SECTION MSGSND_CS;
    //初始化临界区
    InitializeCriticalSection(&MSGSND_CS);
    //临界区使用
    EnterCriticalSection(&MSGSND_CS);
    LeaveCriticalSection(&MSGSND_CS);这是不是只要在一个进程中使用就行了,即在进程1向数据库的表保存内容前使用EnterCriticalSection(&MSGSND_CS);保存完之后使用LeaveCriticalSection(&MSGSND_CS);进程2什么也不添加