void CRecordset::PrepareAndExecute()



  • Hallo
    ich habe ein Problem mit dem Laden von Daten aus meiner Datenbank. Nach intensiver Fehlersuche habe ich folgendes heraus gefunden. Der Fehler geschieht in der void CRecordset::PrepareAndExecute() und zwar gibt der immer ein Exception aus ich weiss nicht warum.

    Das ist mein Datenbankquellcode:

    [cpp]std::string DatabaseConnection::GetUserLevel(std::string UserName, std::string Password)
    {
    	CDatabase UserData;
    	CString DB_File = "Fuhrpark";
    	CString sDsn;
    	CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
    	CString SqlString;
    
    	// The ODBC Connection String
    
    //	sDsn.Format("ODBC;DRIVER={%s};DSN='Fuhrpark';DBQ=%s",sDriver,DB_File);
    
    	TRY
    	{
    		// Open the database
    		UserData.Open( "Fuhrpark" );
    
    		// Allocate the recordset
    		CRecordset recset( &UserData );
    
    		SqlString = "SELECT * FROM tbl_Benutzerliste "
    			" WHERE Benutzername = '";
    		SqlString += UserName.c_str();
    		SqlString += "' and Passwort = '";
    		SqlString += Password.c_str();
    		SqlString += "'";
    
    		// Execute the query		
    
               [b]recset.Open(AFX_DB_USE_DEFAULT_TYPE,SqlString,CRecordset::dynaset  );[/b]
    		CString Benutzername;
    		CString Passwort;
    		CString Rechte;
    		CString Personalnummer;
    
    		recset.GetFieldValue("Benutzername",Benutzername);
    		recset.GetFieldValue("Passwort",Passwort);
    		recset.GetFieldValue("Rechte",Rechte);
    		recset.GetFieldValue("Personalnummer",Personalnummer);
    
    	/*	parameters.Driver			= Benutzername;
    		parameters.Password			= Passwort;
    		parameters.Rights			= Rechte;
    		parameters.PersonalNumber	= Personalnummer;*/
    
    		// go to next record
    		recset.MoveNext();
    
    		// Close the database
    		UserData.Close();
    
    	}
    	CATCH(CDBException, e)
    	{
    			// If a database exception occured, show error msg
    			AfxMessageBox("Database error: "+e->m_strError);
    	}
    
    	END_CATCH;
    
    	return SqlString;
    
    }[/cpp]
    

    Kann mir irgendwer helfen??



  • SqlString = "SELECT * FROM tbl_Benutzerliste "
                " WHERE Benutzername = '";
    

    müsste da nicht noch ein + dazwischen?



  • WO zwischen meinst du??



  • SqlString = "SELECT * FROM tbl_Benutzerliste " +
                     " WHERE Benutzername = '";
    

    Und was steht denn in der Exception drinne? Wäre auch mal von interesse



  • Also wenn ich da nen + zwischen mache sagt der folgende Fehlermeldung:

    C:\Dokumente und Einstellungen\Dors\Desktop\C++\EchoServer\DatabaseConnection.cpp(265) : error C2110: Zwei Zeiger koennen nicht addiert werden
    

    Und so sieht die CRecordset::PrepareAndExecute aus:

    [cpp]void CRecordset::PrepareAndExecute()
    {
    	USES_CONVERSION;
    	RETCODE nRetCode = 0;
    	BOOL bConcurrency = FALSE;
    	LPCSTR lpszWSQL = T2CA(m_strSQL);
    
    	while (!bConcurrency)
    	{
    		// Prepare or execute the query
    		if (m_dwOptions & executeDirect)
    		{
    			AFX_ODBC_CALL(::SQLExecDirect(m_hstmt,
    				(UCHAR*)lpszWSQL, SQL_NTS));
    		}
    		else
    		{
    			AFX_ODBC_CALL(::SQLPrepare(m_hstmt,
    				(UCHAR*)lpszWSQL, SQL_NTS));
    		}
    		if (Check(nRetCode))
    			bConcurrency = TRUE;
    		else
    		{
    			// If "Driver Not Capable" error, assume cursor type doesn't
    			// support requested concurrency and try alternate concurrency.
    			CDBException* e = new CDBException(nRetCode);
    			e->BuildErrorString(m_pDatabase, m_hstmt);
    			if (m_dwConcurrency != SQL_CONCUR_READ_ONLY &&
    				e->m_strStateNativeOrigin.Find(_afxDriverNotCapable) >= 0)
    			{
    #ifdef _DEBUG
    				if (afxTraceFlags & traceDatabase)
    					TRACE0("Warning: Driver does not support requested concurrency.\n");
    #endif
    
    				// Don't need exception to persist while attempting to reset concurrency
    				e->Delete();
    
    				// ODBC will automatically attempt to set alternate concurrency if
    				// request fails, but it won't try LOCK even if driver supports it.
    				if ((m_dwDriverConcurrency & SQL_SCCO_LOCK) &&
    					(m_dwConcurrency == SQL_CONCUR_ROWVER ||
    					m_dwConcurrency == SQL_CONCUR_VALUES))
    				{
    					m_dwConcurrency = SQL_CONCUR_LOCK;
    				}
    				else
    				{
    					m_dwConcurrency = SQL_CONCUR_READ_ONLY;
    					m_bUpdatable = m_bAppendable = FALSE;
    #ifdef _DEBUG
    					if (afxTraceFlags & traceDatabase)
    						TRACE0("Warning: Setting recordset read only.\n");
    #endif
    				}
    
    				// Attempt to reset the concurrency model.
    				AFX_SQL_SYNC(::SQLSetStmtOption(m_hstmt, SQL_CONCURRENCY,
    					m_dwConcurrency));
    				if (!Check(nRetCode))
    				{
    					TRACE0("Error: ODBC failure setting recordset concurrency.\n");
    					ThrowDBException(nRetCode);
    				}
    			}
    			else
    			{
    				TRACE0("Error: ODBC failure on SQLPrepare or SQLExecDirect\n");
    				THROW(e);
    			}
    		}
    	}
    
    	// now attempt to execute the SQL Query if not executed already
    	if (!(m_dwOptions & executeDirect))
    	{
    		AFX_ODBC_CALL(::SQLExecute(m_hstmt));
    		if (!Check(nRetCode))
    			ThrowDBException(nRetCode);
    	}
    	m_lOpen = AFX_RECORDSET_STATUS_OPEN;
    
    	// SQLExecute or SQLExecDirect may have changed an option value
    	if (nRetCode == SQL_SUCCESS_WITH_INFO)
    	{
    		// Check if concurrency was changed in order to mark
    		// recordset non-updatable if necessary
    		DWORD dwConcurrency;
    		AFX_SQL_SYNC(::SQLGetStmtOption(m_hstmt, SQL_CONCURRENCY, &dwConcurrency));
    		if (!Check(nRetCode))
    			ThrowDBException(nRetCode);
    
    		if (dwConcurrency == SQL_CONCUR_READ_ONLY && (m_bUpdatable || m_bAppendable))
    		{
    			m_bUpdatable = FALSE;
    			m_bAppendable = FALSE;
    
    #ifdef _DEBUG
    			if (afxTraceFlags & traceDatabase)
    			{
    				TRACE0("Warning: Concurrency changed by driver.\n");
    				TRACE0("\tMarking CRecordset as not updatable.\n");
    			}
    #endif // _DEBUG
    		}
    	}
    }[/cpp]
    


  • Was vielleicht noch helfen könnte ich bekomme immer die Fehlermeldung zu wenig Parameter übergeben , aber wenn ich im DebugModus gucke, dann seh ich das der beide paremeter übergibt.



  • SqlString = "SELECT * FROM tbl_Benutzerliste "
                " WHERE Benutzername = '";
    

    zu

    SqlString = "SELECT * FROM tbl_Benutzerliste WHERE Benutzername = '";
    

    weis aber net ob das den Fehler verursacht



  • Ne der zeigt mir immer noch diese Fehlermeldung an:

    Database error : 1 Parameter wurde erwartet , aber es wurden zu wenig Parameter übergeben.

    Was ich daran nicht verstehe eigentlich sollen ja 2 Parameter übergeben werden, Benutzername und Passwort. Deswegen kommt mir das alles sehr komisch vor.



  • Pellaeon schrieb:

    weis aber net ob das den Fehler verursacht

    Mit Sicherheit nicht. Zeichenkettenliterale, die nur durch Whitespace getrennt sind, werden einfach zusammengehängt. Deswegen darf da auch kein + stehen.



  • Dann wir der Fehler wohl doch in der PrepareAnd Execute liegen oder??



  • MFK schrieb:

    Pellaeon schrieb:

    weis aber net ob das den Fehler verursacht

    Mit Sicherheit nicht. Zeichenkettenliterale, die nur durch Whitespace getrennt sind, werden einfach zusammengehängt. Deswegen darf da auch kein + stehen.

    ahso ok, was war mir neu, thx für den Hinweis



  • Silvercreast schrieb:

    Dann wir der Fehler wohl doch in der PrepareAnd Execute liegen oder??

    Der Fehler liegt mit an Sicherheit grenzender Wahrscheinlichkeit in deinem Code, nicht im MFC-Code.

    Prüf bitte nochmal ganz genau die Namen der Tabellen und Felder. Heißt es möglichweise Password? Ein falsch geschriebener Tabellen- oder Feldname kann einen solchen Fehler verursachen.



  • Ach scheisse hast recht das heisst nicht Benutzername sondern nur Benutzer 🙄

    Aber ich habe jetzt nen anderes Problem und zwar kommt nun folgende Fehlermeldung:

    Database Error: Vor dem Aufrufen von SQLFetchScroll/SQLExtendedFetch waren keine Spalten gebunden
    Mit der Fehlermeldung kann ich nichts anfangen da ich nicht weiss wo ich SQLFetchScroll und SQLExtendedFetch benutze



  • Habe meinen Fehler gefunden und zwar mus die recset.open folgendermaßen aussehen:

    recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::dynaset);


Anmelden zum Antworten