Ich habe eine Anwendung erstellt, die SQLDriverConnect
aufruft, um eine Verbindung zu einer MS SQL Server-Datenbank namens "MyDB" herzustellen. Nach einigen Aktionen ruft es SQLDisconnect.Aber dann kann SSMS 'MyDB' nicht löschen. Dies bedeutet, dass einige Ressourcen nicht ordnungsgemäß geschlossen werden. Nur nach dem Beenden des Prozesses, löscht SSMS es (, d. H. das OS veröffentlicht sie) und alle SQLHENV und SQLHDBC werden ordnungsgemäß freigegeben. -Code unten:ODBC-Objekte korrekt freigeben?
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;
};
Wie kann ich feststellen, welches Objekt nicht freigegeben? Gibt es noch weitere Überlegungen, die ich anstellen sollte? Jede Idee oder Hilfe wird geschätzt. Edit: Code zum Freischalten:
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;
}
}
Was ist das Ergebnis von SQLDisconnect? Ihr Code postete nur das Freigeben des Anweisungshandles, was ist mit dem Verbindungs- und Umgebungshandle? – erg
Sie werden mit SQLFreeHandle freigegeben. Ich habe nur den Code zum Zerstören von Aussagen gepostet, weil Aussagen weit verbreitet sind und man sie leicht vergessen kann. –
Wenn Sie ein Verbindungs-Handle freigeben, sollten Sie einen SQLERROR als Rückgabewert erhalten, wenn offene Anweisungs-Handles von diesem Verbindungs-Handle stammen, nicht? – erg