SQLDriverConnect
を呼び出して、「MyDB」というMS SQL Serverデータベースに接続するアプリケーションを作成しました。いくつかのことをした後、SQLDisconnectを呼び出します。しかし、SSMSは 'MyDB'を削除できません。これは、一部のリソースが正しく閉じられていないことを意味します。プロセスを終了した後でなければ、SSMSはそれを削除します(つまり、がOSをリリースします)、すべての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の結果はどのようなものです:たぶん... SQL Serverの側のツールは、その時点で正確に開いているものについての詳細を分析するために
詳細はこちらを参照してくださいがあるだろうか?あなたのコードはステートメントハンドルを解放するだけです。接続と環境ハンドルはどうですか? – erg
これらはSQLFreeHandleを使用して解放されます。ステートメントが広く使用されており、それらを解放するのを忘れることはかなり可能であるため、私はステートメントを破棄するためのコードを投稿しました。 –
接続ハンドルを解放した場合、その接続ハンドルから発生したオープンステートメントハンドルがあれば、戻り値としてSQLERRORを取得する必要があります。 – erg