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 😉


Anmelden zum Antworten