我創建了一個應用程序,它調用SQLDriverConnect
連接到名爲'MyDB'的MS SQL Server數據庫。做了一些事情之後,它調用SQLDisconnect.But然後SSMS無法刪除'MyDB'。這意味着一些資源沒有正確關閉。只有在退出該過程之後,SSMS纔會刪除它(,即操作系統釋放它們的),並且所有SQLHENV和SQLHDBC都已正確釋放。下面 代碼:如何正確釋放ODBC對象?
SMARTHSTMT::~SMARTHSTMT()
{
if (!m_hstmt) return;
SQLFreeStmt(m_hstmt, SQL_CLOSE);
SQLFreeStmt(m_hstmt, SQL_UNBIND);
SQLFreeStmt(m_hstmt, SQL_RESET_PARAMS);
SQLFreeHandle(SQL_HANDLE_STMT, m_hstmt);
m_hstmt = nullptr;
};
我怎樣才能找到哪個對象不會被釋放?我應該採取其他考慮嗎?任何想法或幫助表示讚賞。 編輯:用於斷開代碼:
void AConnection::uDisconnect()
{
if (m_hdbc)
{
SQLDisconnect(m_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, m_hdbc);
m_hdbc = nullptr;
}
if (m_henv)
{
SQLFreeHandle(SQL_HANDLE_ENV, m_henv);
m_henv = nullptr;
}
}
什麼是調用SQLDisconnect的結果呢?你發佈的代碼只是爲了釋放語句句柄,連接和環境處理如何? – erg
使用SQLFreeHandle釋放它們。我只發佈銷燬語句的代碼,因爲聲明被廣泛使用,他們很可能忘記釋放它們。 –
如果釋放連接句柄,如果有任何打開的語句句柄來自該連接句柄,則應該得到一個SQLERROR作爲返回值,而不是? – erg