使用MFC的ODBC去连接ACCESS数据库后,怎样断开与数据库和数据源的连接。解决办法
使用MFC的ODBC去连接ACCESS数据库后,怎样断开与数据库和数据源的连接。
使用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_Remarks);
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();”以后,程序还是无法与数据库断开连接,因为我需要用到不退出程序的情况下,备份数据库与恢复数据库,所以请大家帮我想个办法把与数据库或数据库的当前连接断开可以吗?一定是我那里没释放或没关闭,大家帮我看看,谢谢了!
------解决方案--------------------
你自己做一个简单的程序,不要搞的这么复杂,然后试试看,看行不行;
行得通的话,再找出问题来。
------解决方案--------------------
我只能劝你别用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
使用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_Remarks);
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();”以后,程序还是无法与数据库断开连接,因为我需要用到不退出程序的情况下,备份数据库与恢复数据库,所以请大家帮我想个办法把与数据库或数据库的当前连接断开可以吗?一定是我那里没释放或没关闭,大家帮我看看,谢谢了!
------解决方案--------------------
你自己做一个简单的程序,不要搞的这么复杂,然后试试看,看行不行;
行得通的话,再找出问题来。
------解决方案--------------------
我只能劝你别用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