SQLExecDirect liefert -1 zurück



  • Wie schon im Titel beschrieben wenn ich die folgende Anweisung ausführe bekomme -1 als rückgabewert.

    retcode = SQLExecDirect(hstmt, (SQLCHAR*) cTemp, SQL_NTS);
    

    Hab in der MSDN nachgeschaut aber hab nichts über negative Werte gefunden kann mir jemand von euch eventuell sagen was das zu bedeuten hat bzw. was ich Falsch mache?



  • Aus sql.h:

    #define SQL_SUCCESS                0
    #define SQL_SUCCESS_WITH_INFO      1
    #if (ODBCVER >= 0x0300)
    #define SQL_NO_DATA              100
    #endif
    #define SQL_ERROR                 (-1)
    #define SQL_INVALID_HANDLE        (-2)
    
    #define SQL_STILL_EXECUTING        2
    #define SQL_NEED_DATA             99
    

    Da hast du deine -1 😉



  • Ohja hab ich ganz übersehen jetzt frag ich mich nur wo da mein Fehler ist? Die SQL Anweisung selbst läuft im Queryanalyzer.



  • Klausii schrieb:

    Ohja hab ich ganz übersehen jetzt frag ich mich nur wo da mein Fehler ist?

    Tja, da du das Statement hier nicht zeigst, wird dir das nur jemand mit hellseherischen Fähigkeiten beantworten können.

    In der MSDN Library steht im Eintrag zu SQLExecDirect aber auch, wie du an weitere Fehlerinformationen kommst.



  • Okay hier mal der Code

    strSQL  = _T( "SELECT PRUEFUNGEN.MASCHINENNR "                                );
          strSQL += _T( "FROM ( "                                                       );
          strSQL += _T( "       ( "                                                     );
          strSQL += _T( "         ( "                                                   );
          strSQL += _T( "           PRUEFUNGEN INNER JOIN PRUEFFEHLER ON "              );
          strSQL += _T( "             PRUEFUNGEN.PRUEFNR = PRUEFFEHLER.PRUEFNR "        );
          strSQL += _T( "         ) INNER JOIN PLAETZE ON "                             );
          strSQL += _T( "             PRUEFUNGEN.PLATZ = PLAETZE.BEZEICHNER "           );
          strSQL += _T( "       ) INNER JOIN STAMMDATEN ON "                            ); 
          strSQL += _T( "           PRUEFUNGEN.MASCHINENNR = STAMMDATEN.MASCHINENNR "   );
          strSQL += _T( "       LEFT JOIN NACHARBEIT ON "                               );
          strSQL += _T( "         PRUEFUNGEN.MASCHINENNR = NACHARBEIT.MASCHINENNR "     );
          strSQL += _T( "WHERE ( "                                                      );
          strSQL += _T( "        ((PRUEFFEHLER.FEHLERSTATUS)<4) AND "                   );
          strSQL += _T( "        ((PLAETZE.LETZTERPLATZ)=1) AND "                       );
          strSQL += _T( "        ((STAMMDATEN.LETZTERMASCHINENSTATUS)<>'9') AND "       );
          strSQL += _T( "        ((PRUEFUNGEN.STATUS)<0) AND "                          );
          strSQL += _T( "        ((NACHARBEIT.MASCHINENNR) Is Null) "                   );
          strSQL += _T( "      ) "                                                      );
          strSQL += _T( "GROUP BY PRUEFUNGEN.MASCHINENNR"                              );
    
      n = WideCharToMultiByte(CP_ACP,0,(LPCWSTR) strSQL, strSQL.GetLength(), cTemp, 2048, 0, 0);
      cTemp[n] = 0;
    
      retcode = SQLExecDirect(hstmt, (SQLCHAR*) cTemp, SQL_NTS);
    
      ODBCConnect.SetModus(FALSE);
    
      if (retcode == SQL_SUCCESS)
      {
        while (FALSE == bEOF)
        {
         retcode = SQLFetch(hstmt);
    
         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
         {
           if (FALSE == bNew)
           {
              ODBCConnect.GetDataLong   (hstmt, structNacharbeit.lListposition,       1);
              ODBCConnect.GetDataString (hstmt, structNacharbeit.strMaschinenNr, 100, 2);
              ODBCConnect.GetDataString (hstmt, structNacharbeit.strStandort,    50,  3);
    
    					ODBCConnect.GetDataDate (hstmt, structNacharbeit.tmBeginnDatum,  4);
    
           }
           else
           {
            lStartID ++;
            structNacharbeit.lListposition = lStartID;
            ODBCConnect.GetDataString (hstmt, structNacharbeit.strMaschinenNr, 100, 1);
            //structNacharbeit.strStandort = "(neuer Standort)";
            structNacharbeit.strStandort = NEUER_STANDORT;
    
    				structNacharbeit.tmBeginnDatum.SetDate(INIT_YEAR,INIT_MONTH,INIT_DAY);
    				for (int i =0;i<= pArrStammdat->GetUpperBound();i++)
    				{
    					if (pArrStammdat->GetAt(i).strMaschinenNr == structNacharbeit.strMaschinenNr)
    					{
    						structNacharbeit.tmBeginnDatum = pArrStammdat->GetAt(i).tmBeginnDatum;
    						break;
    					}
    				}
    
           }//end if (FALSE == bNew)
    
           pArrNacharbeit->Add(structNacharbeit);
         } // if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
         else
         {
           bEOF = TRUE;  //EOF erreicht
         } //if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) else
        } // while (FALSE = bEOF)
      } // if (retcode == SQL_SUCCESS)
      else
      {
        AfxMessageBox (_T("Error ODBC-Connect (NACHARBEIT)"));
      }
    


  • Ist ja keine einfache Abfrage mit den ganzen INNER JOIN usw.. Du könntest ja mal ausprobieren, ob es mit einer einfachen SELECT-Abfrage funktioniert. Wenn ja, dann ist der Code schon mal richtig. Dann könntest du ein JOIN nach dem anderen wieder rein nehmen um festzustellen, wo er nicht mehr mitmacht. Vielleicht ist das einfach zu komplex, sodass ein Timeout o.ä. dazwischen haut. Da könnte dann wieder ein SetQueryTimeout(...) helfen.
    Eine andere Sache sind die ganzen Formatierungen (Leerzeichen) in der SQL-Anweisung. Muss kein Fehler verursachen, könnte aber...


Anmelden zum Antworten