2016-04-04 10 views
1

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; 
    } 
} 
+0

のSQLDisconnectの結果はどのようなものです:たぶん... SQL Serverの側のツールは、その時点で正確に開いているものについての詳細を分析するために

詳細はこちらを参照してくださいがあるだろうか?あなたのコードはステートメントハンドルを解放するだけです。接続と環境ハンドルはどうですか? – erg

+0

これらはSQLFreeHandleを使用して解放されます。ステートメントが広く使用されており、それらを解放するのを忘れることはかなり可能であるため、私はステートメントを破棄するためのコードを投稿しました。 –

+0

接続ハンドルを解放した場合、その接続ハンドルから発生したオープンステートメントハンドルがあれば、戻り値としてSQLERRORを取得する必要があります。 – erg

答えて

0

あなたはSQLDisconnect()場合戻りSQL_ERRORを確認することができます。その場合は、依然として文が開いているか、検出されたトランザクションがまだ開かれている可能性があります。 ODBCでの取り扱い

トランザクションは次のように(単純化)されます。デフォルトでは

が自動コミット有効になっています。すべてが新しいトランザクションを開始し、ステートメントが成功するとトランザクションがコミットされます。コミットモードを変更していない場合は、トランザクションがまだ開かれていることを私に混乱させます。

自動コミットを無効にしている場合、進行中のトランザクションをコミットまたはロールバックするには、手動でSQLEndTrans(...)を呼び出す必要があります。私が知る限り、トランザクションがまだ開いている場合、ODBCにドライバを問い合わせる方法はありません。

SQLEndTrans()への呼び出しに言及しているので、私はすでに自動コミットを無効にしていると思います。私の情報源を見ると、私はコネクションハンドルを閉じる前に常にロールバックをしているのが分かります。おそらく同じ問題が原因で、正確に(古いコード)覚えていません。

とにかく、手動コミットモードを有効にしている場合は、接続ハンドルを閉じる前にロールバックを実行することをお勧めします。 https://msdn.microsoft.com/en-us/library/ms131281.aspx

+0

ありがとうございます。あなたの答えは非常に明確で有用です。あなたが推測したように、私は自動コミットを無効にし、SQLEndTransを呼び出してコミットまたはロールバックします。私はSQLDisconnectもロールバックすることに決めました。これは私の最後の質問です:なぜSQLColumns、SQLTables、SQLStatisticsなどの文がトランザクションを開始するのですか? –

+0

@MohamadrezaAbdolahzadeh:なぜカタログ機能がトランザクションを開始するのか分かりません。私は同じ問題を抱えて苦労したと思うし、有用な解決策を見つけられなかった。たぶん、これはスタンドアロンの質問として追加する価値があるでしょう。 – erg

関連する問題