void CRecordset::PrepareAndExecute()
-
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);