Gelöst: ODBC: Programmabsturz, wenn SQLFetch in Klasse
-
Hallo,
ich programmiere gerade eine Clientanwendung für eine Datenbank.
Ich versuche die C API von ODBC (Windows) in Klassen zu packen.Eine Klasse (SQLReader), die das Auslesen vereinfachen soll, sieht so aus:
Man führt einen SQL-Befehl aus und übergibt ihr das Statementhandle:SQLReader.h
#pragma once class SQLReader { private: SQLHSTMT m_hStmt; SQLRETURN m_Return; SQLSMALLINT m_ColumnCount; std::vector<SQLPOINTER> m_Data; public: SQLReader(SQLHSTMT hStmt); bool ReadData(void); std::vector<SQLPOINTER> GetData(void); };
SQLReader.cpp
#include "StdAfx.h" #include "SQLReader.h" SQLReader::SQLReader(SQLHSTMT hStmt) { // SQL-Statement-Handle zuweisen this->m_hStmt = hStmt; // Anzahl der auszulesenden Spalten abfragen this->m_Return = SQLNumResultCols(this->m_hStmt, &this->m_ColumnCount); // Datenpuffer initialisieren this->m_Data = std::vector<SQLPOINTER>(this->m_ColumnCount); // Jeder Spalte ein Feld im Datenpuffer zuweisen for(SQLSMALLINT i = 1; i <= this->m_ColumnCount; i++) { this->m_Return = SQLBindCol(this->m_hStmt, i, SQL_C_DEFAULT, &this->m_Data[i-1], sizeof(this->m_Data), NULL); } } bool SQLReader::ReadData(void) { // Einen Datensatz in den Puffer schreiben this->m_Return = SQLFetch(this->m_hStmt); // <-------------- Absturz // Wenn kein Datensatz geladen werden konnte, // Vorgang abbrechen if(!SQL_SUCCEEDED(this->m_Return)) return false; return true; } std::vector<SQLPOINTER> SQLReader::GetData(void) { return this->m_Data; }
Beim Absturz gibt es eine Zugriffsverletzung beim Schreiben.
Unbehandelte Ausnahme bei 0x5d44d51c (msvcr100d.dll) in SQLTest.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000001.
Ich denke es liegt, daran, dass der Buffer ein Klassenmember ist.
Wie kann man den Problem lösen, bzw. den Buffer statisch machen, ohne die Objektorientierung zu verlieren?Vielen Dank
Fabian
-
Gelöst: Es lang nicht an dieser Klasse, sondern an einer anderen, die diese verwendet