使用MFC的ODBC去连接ACCESS数据库后,怎样断开与数据库和数据源的连接。声明:
CDatabase m_DB;
CMemberRecordset m_SetMember; HANDLE hFile;
//自动创建数据源初始化
//----------------------------------------------------------------------------------------
    CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
CString lpszFile = sPath + "\\MemberData.mdb";
 
char* szDesc;
int mlen;
szDesc=new char[256];
sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s? FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","SearchMemberData",lpszFile,sPath);
mlen = strlen(szDesc);
for (int i=0; i<mlen; i++)
{
if (szDesc[i] == '?')
szDesc[i] = '\0';
} if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc))
AfxMessageBox("SQLConfigDataSource Failed");

    try
{
CString strConnect;
strConnect.Format("DSN=SearchMemberData;");
if(!m_DB.OpenEx(strConnect,CDatabase::useCursorLib))
{
AfxMessageBox("Unable to Connect to the Specified Data Source");
}
else
{
int i=0;
LPCTSTR lpszSQL = NULL;
DWORD dwOptions = NULL;
if(!m_SetMember.IsOpen())
{
m_SetMember.Open(AFX_DB_USE_DEFAULT_TYPE,lpszSQL,dwOptions);
}
m_SetMember.MoveFirst();
do
{  
CString str;
m_MemberData.InsertItem(i, m_SetMember.m_Job, 0);
str.Format("%s",m_SetMember.m_Name);
m_MemberData.SetItemText(i, 1, str);
str.Format("%s",m_SetMember.m_Number);
m_MemberData.SetItemText(i, 2, str);
str.Format("%s",m_SetMember.m_Date);
m_MemberData.SetItemText(i, 3, str);
str.Format("%s",m_SetMember.m_Res);
m_MemberData.SetItemText(i, 4, str); i++;
m_SetMember.MoveNext();
} while(!m_SetMember.IsEOF()); m_SetMember.Close(); m_DB.Close();
}
}
catch(CDBException *pE)
{
pE->ReportError();
pE->Delete();
}上边这样写代码后,把“m_SetMember.Close();”和“m_DB.Close();”以后,程序还是无法与数据库断开连接,因为我需要用到不退出程序的情况下,备份数据库与恢复数据库,所以请大家帮我想个办法把与数据库或数据库的当前连接断开可以吗?一定是我那里没释放或没关闭,大家帮我看看,谢谢了!

解决方案 »

  1.   

    你好,上边就是我写的简单的小程序哦。
    我使用VC++6.0中的调试功能单步跟了N次后,感觉就是“m_SetMember.Open”后出了问题,不知道怎么去断开数据库或数据源的连接。我试过很多次了,实在是没办法了。
    请会的人帮帮我,谢谢!!
      

  2.   

    有知道解决办法的朋友吗?
    麻烦回答下,谢谢!
    如果不方便回答的话,可以E-MAIL:[email protected]告诉我。
      

  3.   

    我只能劝你别用ODBC,老掉牙了,换ADO或者OLEDB不好么?之所以不能关闭,是因为数据库还没有做完隐式的transactions
    你可以把这个工作改为明确的transactions。例如下面的代码:所有的transaction全部结束,数据库才可以关闭。   CMyDatabase   db;
       db.Open("MY_DATASOURCE");
       CMyRecordset  rs(&db);   db.BeginTrans();                       // start transaction 1
       rs.Open();                             // open the recordset   // manipulate data   db.CommitTrans();                      // or Rollback()   ::SQLFreeStmt(rs.m_hstmt,SQL_CLOSE);   // close the cursor
       db.BeginTrans();                       // start transaction 2
       rs.Requery();                          // now get the result set   // manipulate data   db.CommitTrans();                      // end transaction 2   rs.Close();
       db.Close();这些写保证可以关闭。