Programm stürzt ab (System.AccessViolationException:)

themonk

Erfahrenes Mitglied
Hallo,
nachdem ich es geschafft habe mein Projekt soweit fertig zu stellen.
Musste ich beim testen feststellen das das Programm mit folgender Fehlermeldung abstürzt:
System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
bei mysql_num_fields(st_mysql_res* )
Dazu habe ich hier im Forum und bei google auch etwas gefunden aber keine Lösung für mein Problem. Also habe ich nachgeschaut wo das Problem in meinem Code ist.
Dabei ist mir aufgefallen das wenn ich folgende Zeile auskommentiere das Programm ohne Fehler läuft
Code:
     MYSQL *connection, mysql;
MYSQL_RES *result;
    MYSQL_ROW row;
unsigned int num_fields;
    unsigned int i;
....
num_fields = mysql_num_fields(result);

   while ((row = mysql_fetch_row(result))) 
            { 
...
Der Fehler kommt etwa dann wenn diese Funktion ca.200mal aufgerufen wurde
 
Hallo,

bitte poste das ... vor dem Aufruf komplett. Du rufst die Funktion ja richtig auf. SystemAccessViolation in so einem Zusammenhang bedeutet, dass der Pointer, den du der Funktion übergibst ("result") an eine falsche Stelle zeigt. Deswegen brauchen wir den Code davor um festzustellen wo der Fehler liegt und was alles mit result zwischendrin gemacht wird.

Gruß
stephsto
 
Code:
..include und co...

MYSQL *connection, mysql;
MYSQL_RES *result;
    MYSQL_ROW row;
unsigned int num_fields;
    unsigned int i;
char * test;

test="";
     /* connect to the mySQL database at test.domain.de */
    mysql_init(&mysql); 
   /* Mit dem Server verbinden */
   connection =mysql_real_connect (
        &mysql,   /* Zeiger auf MYSQL-Handler*/
        "localhost", /* Host-Name*/
        "user", /* User-Name*/
        "pw", /* Passwort für user_name */
        NULL,  /* Name der Datenbank*/
        0,     /* Port (default=0) */
        NULL,  /* Socket (default=NULL)*/
        0      /* keine Flags */  ) ;
		
		
		if(connection== NULL) {
      fprintf (stderr, "Fehler mysql_real_connect():"
        "%u (%s)\n",mysql_errno (&mysql), mysql_error (&mysql));

	  
   }
   else{
      printf("Erfolgreich mit dem MySQL-Server verbunden\n");
	


   }
std::string strQuery =  "SELECT * FROM `test`.`test` WHERE art='1' ";//Datenbank abfrage
mysql_query( &mysql, strQuery.c_str());
 result = mysql_store_result(&mysql);


 num_fields = mysql_num_fields(result);

   while ((row = mysql_fetch_row(result))) 
            { 

			   test= row[1]; //Inhalt des Feldes
            
              }




return test;  //Schreibt auf dem Button
 
Ich habe zwar nicht herausgefunden wie man sich einen Mysql Error anzeigen lassen kann aber ich gehe mal davon aus das ich Zuviel Connections zur Datenbank mache da ich die Funktion ja ein paar Hundert Mal aufrufe. Habe die Klammer hinter „ printf("Erfolgreich mit dem MySQL-Server verbunden\n"); }
„ einfach mal ans Ende gesetzt und dann kommt zwar kein Fehler mehr aber es wird auch nichts mehr aus der Datenbank ausgelesen.
Muss jetzt nur eine Passende stelle finden wo ich die Datenbank Verbindung herstellen kann.
Reicht es wenn ich
Code:
    MYSQL *connection, mysql;
MYSQL_RES *result;
    MYSQL_ROW row;



     /* connect to the mySQL database at test.domain.de */
    mysql_init(&mysql); 
   /* Mit dem Server verbinden */
   connection =mysql_real_connect (
        &mysql,   /* Zeiger auf MYSQL-Handler*/
        "localhost", /* Host-Name*/
        "user", /* User-Name*/
        "pw", /* Passwort für user_name */
        NULL,  /* Name der Datenbank*/
        0,     /* Port (default=0) */
        NULL,  /* Socket (default=NULL)*/
        0      /* keine Flags */  ) ;
einfach vorher mal include?
 
Ich habe zwar nicht herausgefunden wie man sich einen Mysql Error anzeigen lassen kann
Das steht aber in deinem Code :confused: ?
Muss jetzt nur eine Passende stelle finden wo ich die Datenbank Verbindung herstellen kann.
Warum machst du das nicht bevor du die Funktion aufrufst und übergibst dann das MYSQL Objekt als Parameter an die Funktion?

Dann solltest du natürlich auch das Resultat (wenn es eins gab) und die Verbindung wieder freigeben. Das machst du anscheinend auch nirgendwo. Lies doch mal die Dokumentation der Funktionen, da steht dann was du aufrufen mußt um die Resourcen freizugeben.

Gruß
 
Das steht aber in deinem Code :confused: ?
Oh stimmt. Kommt auf jedenfall als Fehler:Too many connections

Nur wie mache ich das jetzt das alle Funktion auf ein Datenbank Verbindung zugreifen können, schon klar das ich das vor allen Funktionien machen muss nur wie. Am besten wäre doch eine Funktion in der die Verbindung hergestellt wird und dann im result das &mysql hat.
Code:
 MYSQL *connection, mysql;
 /* connect to the mySQL database at test.domain.de */
    mysql_init(&mysql); 
   /* Mit dem Server verbinden */
   connection =mysql_real_connect (
        &mysql,   /* Zeiger auf MYSQL-Handler*/
        "localhost", /* Host-Name*/
        "user", /* User-Name*/
        "pw", /* Passwort für user_name */
        NULL,  /* Name der Datenbank*/
        0,     /* Port (default=0) */
        NULL,  /* Socket (default=NULL)*/
        0      /* keine Flags */  ) ;

result &mysql;
geht aber nicht
 
Zurück