SQLHSTMT Problem



  • Hallo,

    ich habe mal eine Frage zu den Statement Handle HSTMT vom Typ SQLHSTMT.

    Ich habe eine Funktion die den Handle hstmt benutzt um Daten aus einer Datenbank
    mittels SQLFetch() auszugeben.

    Dann habe ich eine weitere Funktion die auch den Handle hstmt benutzt und ebenfals mit
    SQLFetch() Datensätze abruft.

    Wenn ich aber nun der 1. Funktion wieder sage mach da weiter mit SQLFetch() wo du aufgehört hast
    gibt es einen Fehler.

    Gibt es eine Möglichkeit den hstmt irgendwie zwischenzuspeichern oder mit der Methode SQLFreeStmt()
    den Handle anderweitig zu beeinflussen?

    Gruß
    -Patrick Roth



  • Was für ein Fehler kriegst du den?



  • also eine Fehlermeldung bekomme ich nicht.

    Bei der 2 Funktion wird der Hstmt neu initialisiert sodas beim dem erneueten Aufruf der 1. Funtkion der alte Index verloren geht.



  • könntest du vielleicht ein wenig code zeigen, damit es besser nachvollzogen werden kann



  • Hi, erstnochmal vielen Dank für deine Bemühungen.

    Hier ist erstmal mein Source Code:

    void ODBCZugriff::getprofile(int kontrollnummer)
    {
    	if (kontrollnummer==0) // Zum ersten Mal hohlen und damit Initialisieren
    	{
    		string ausfuehren="SELECT `Index`,`Fahrzeug`,`Bezeichner`,`weiterer Bezeichner`, `Pfad des Bildes` from profile ORDER BY `Index` ASC";
    
    		directexec(ausfuehren);
    
    		SDWORD var1,var2,var3,var4,var5;
    
    		SQLBindCol(hstmt, 1, SQL_C_SLONG, (PTR)&p_Index, sizeof(p_Index), &var1);
    		SQLBindCol(hstmt, 2, SQL_C_CHAR, p_Fahrzeug, 30, &var2);
    		SQLBindCol(hstmt, 3, SQL_C_CHAR, p_Bezeichner, 30, &var3);
    		SQLBindCol(hstmt, 4, SQL_C_CHAR, p_weiterer, 30, &var4);
    		SQLBindCol(hstmt, 5, SQL_C_CHAR, p_pfad, 100, &var5);
    
    	     	MoveSet();
    	} 
    	if (kontrollnummer==1)
    	{                               // weitermachen, Sprung auf nächsten Zeile
    		MoveSet();
    	}
    
    }
    
    void ODBCZugriff::getreferrenzen(int kontrollnummer)
    {
    	if (kontrollnummer==0) // Zum ersten Mal hohlen und damit Initialisieren
    	{
    
    		string ausfuehren="SELECT `Index`,`Referrenzschluessel` from referrenzen ORDER BY `Index` ASC";
    
    		directexec(ausfuehren);
    
    		SDWORD var1,var2;
    
    		SQLBindCol(hstmt, 1, SQL_C_SLONG, (PTR)&r_Index, sizeof(r_Index), &var1);
    		SQLBindCol(hstmt, 2, SQL_C_CHAR, r_referrenzschluessel, 30, &var2);
    
    		MoveSet();
    	} 
    	if (kontrollnummer==1)
    	{                               // weitermachen, Sprung auf nächsten Zeile
    		MoveSet();
    	}
    
    }
    
    void ODBCZugriff::MoveSet()
    {
       SQLFetch(hstmt);
    }
    

    es geht um die beide Funktionen, getreferrenzen und getprofile.
    jetzt nochmal ein beispiel wie ich sie aufrufe.

    So kommt es nicht zum Fehler da ich sie nacheinander alle durchlaufe.

    ODBCZugriff dd;
    dd.getprofile(0);
    // jetzt werden die Variablen umgespeichert. Die vom 1. Datensatz
    dd.getprofile(0);
    // jetzt werden die Variablen umgespeichert. Die vom 2. Datensatz
    dd.getreferrenzen(0);
    // jetzt werden die Variablen umgespeichert. Die vom 1. Datensatz
    dd.getreferrenzen(1);
    // jetzt werden die Variablen umgespeichert. Die vom 2. Datensatz
    

    und so kommt es zum Fehler:

    ODBCZugriff dd;
    dd.getprofile(0);
    // jetzt werden die Variablen umgespeichert. Die vom 1. Datensatz
    dd.getreferrenzen(0);
    // jetzt werden die Variablen umgespeichert. Die vom 1. Datensatz
    dd.getprofile(1);
    // jetzt werden die Variablen umgespeichert. Die vom 2. Datensatz
    dd.getreferrenzen(1);
    // jetzt werden die Variablen umgespeichert. Die vom 2. Datensatz
    

    Beim 2. Beispiel kommt er mit der Reihenfolge durcheinander, weil der Hstmt bereits anders initialisert wurden. Desshalb fragte ich ob es eine Möglichkeit
    gibt ihn zwischenzuspeichern.


Anmelden zum Antworten