Erkenne meinen Fehler nicht

Silvercreast

Erfahrenes Mitglied
Hallo

ich habe eine Musik Datenbank geschrieben, die alle Dateien in einer Access Datenbank speichern soll. Das Laden funktioniert auch einwandfrei, nur beim speichern habe ich noch eine Fehlermeldung und ich kann mir diesen Fehler nicht erklären.

Code:
void MusicManagement ::StoreDB(MusicPiece NewSong)
{
        CDatabase music_data;
        CString SqlString;
	CString strErgebnis;


		// Open the database
		music_data.Open( "MUSIK" );
		

		music_data.BeginTrans();

		SqlString.Format( "%s,%s,%s,%s,%s", NewSong.Shelf,NewSong.Interpreter,NewSong.Title,NewSong.Rubric,NewSong.CD);

		strErgebnis = "Insert into tbl_Datenbank " + SqlString +;
		music_data.ExecuteSQL(strErgebnis); // SQL absenden
		music_data.CommitTrans(); // daten festschreiben


		music_data.Close();

}

Der Fehler taucht an der markierten Stelle auf und lautet:

C:\Dokumente und Einstellungen\Dors\Desktop\C++ Projekte\Musik_Datenbank\MusicManagement.cpp(205) : error C2059: Syntaxfehler : ';'

Ich weiss net welches ; mit diesem Syntaxfehler gemeint ist, kann mir irgendwer helfen

gruss Silver
 
Lösche mal das letzte +-Zeichen in der Zeile. Ich denke mal, der Compiler erwartet hier noch etwas, was er an den String anhängen kann. Und da nix kommt, meckert er eben.

Mfg

langer
 
Danke das war der Fehler, darauf wär ich so schnell nicht gekommen.

Aber jetzt sagt der Compiler wenn ich speichern will mir diese MessageBox:

Unbehandelte Ausnahme bei 0x1021674c (MSVCRTD.DLL) in Musik_Datenbank.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x000000cc.

Und zeigt mir im Debugger den Quellcode an:
Code:
/* UNDONE: handle '#' case properly */
                /* scan for null upto i characters */
#ifdef _UNICODE
                if (flags & FL_SHORT) {
                    if (text.sz == NULL) /* NULL passed, use special string */
                        text.sz = __nullstring;
                    p = text.sz;
                    for (textlen=0; textlen<i && *p; textlen++) {
                        if (isleadbyte((int)*p))
                            ++p;
                        ++p;
                    }
                    /* textlen now contains length in multibyte chars */
                } else {
                    if (text.wz == NULL) /* NULL passed, use special string */
                        text.wz = __wnullstring;
                    bufferiswide = 1;
                    pwch = text.wz;
                    while (i-- && *pwch)
                        ++pwch;
                    textlen = (int)(pwch - text.wz);       /* in wchar_ts */
                    /* textlen now contains length in wide chars */
                }

und zeigt auf die markierte Stelle kannst du mir bei dieser Fehlermeldung vielleicht helfen
 
Leider ist aus deinem Schnipsel nicht zu ersehen, welchen Inhalt die Variable i hat und was *p repräsentiert. Hast du denn mal geprüft, wann genau die Exception kommt? Ob beim ersten Aufruf oder nach mehreren Schleifendurchläufen?
Ich würde da mal im Einzelschritt durchgehen.

Mfg

langer
 
Ich hab das Programm jetzt mal Schritt für Schritt durchgelaufen und festgestellt das er hier :

Code:
SqlString.Format( "%s,%s,%s,%s,%s", NewSong.Shelf,NewSong.Interpreter,NewSong.Title,NewSong.Rubric,NewSong.CD);

rausfliegt.

Hab ich da was falsch gemacht
 
Deine Strings da in NewSong sind doch char-Arrays (bzw. char-Pointer)? Mit CString oder std::string kannst du das mit den Format-Befehlen nicht machen.

Da musst du für CString ein LPCTSTR-Cast machen: (LPCTSTR)NewSong.Shelf
Und für std::string die c_str()-Funktion aufrufen: NewSong.Shelf.c_str()
 
Also NewSong ist vom Typ MusicPiece und in dieser Class sind die variablen als std::string deklariert::

Code:
MusicPiece NewSong;


	NewSong.Interpreter = GetText( m_Interpreter );
	//m_Interpreter.GetWindowText( temp );
	//NewSong.Interpreter	= LPCTSTR( temp );
	
	NewSong.Title = GetText( m_Title );

	NewSong.Rubric = GetText( m_Rubric );
	
	NewSong.Shelf = GetText( m_Shelf );

	NewSong.CD = GetText( m_CD );
/*********************************************************************************************/

class MusicPiece  
{
public:

	std::string Interpreter;
	std::string Title;
	std::string Rubric;
	std::string CD;
	std::string Shelf;
				

	
public:
	MusicPiece();
	virtual ~MusicPiece();



};

Also muss ich .c_str() benutzen
 
Jetzt wird mir gesagt Syntaxfehelr in der Insert into anwendung

was kann denn da jetzt schon wieder falsch sein:

Code:
strErgebnis = "Insert into tbl_Datenbank " + SqlString ;
 
SqlString ist ein CString vermute ich?

Dann änder die Zeile so ab:

strErgebnis = "Insert into tbl_Datenbank ";
strErgebnis += (LPCTSTR)SqlString;

Und lass die auf zwei Zeilen. Ich hatte schon mal den Fall, dass der Compiler aus zwei char* einen neuen char* errechnet hat und den dann als String-Quelle für std::string verwendet hat. Glaub mir, das willst du nicht.
 

Neue Beiträge

Zurück