ADOSql Problehm



  • Also:
    ich habe 2 Methoden die Fast das gleiche machen, die eine ist für mehrere Tabellen ausgelegt, und die andere is abgespeckt und nur für eine. Das Problehm ist jetzt das bei der "GetTableValues" Methode etwas zurückgegeben wird und bei der "Sql2DB" immer NULL zurück gegeben wird. Ich verstehs langsam nicht mehr, sogar die SQL Anweisung selbst ähnelt sich

    AnsiString __fastcall Tmod_DBase_con::Sql2DB(AnsiString Tabelle, AnsiString Feld, AnsiString SqlCommand)
    /*
      Sendet einen SQL Befehl ( nur DDL ) an die DB und liefert das Ergebniss zurück
    */
    {
      AnsiString tmpTable = "";
      AnsiString tmpSrc = "";
      try
      {
          tmpTable = ADOTable1->TableName;
          ADOTable1->TableName = Tabelle;
          ADOTable1->Active = false;
          ADOTable1->Active = true ; //ein/Ausschalten um die Table zu wechseln
          ADOQuery1->ConnectionString = ADOConnection1->ConnectionString;
          ADOQuery1->SQL->Clear();
          ADOQuery1->SQL->Add(SqlCommand);
          ADOQuery1->Active = true;
    
          ADOQuery1->Open();
    
          return mod_DBase_con->SqlZellen; //CommandText;
    
          ADOQuery1->Active = false;
          ADOTable1->TableName = tmpTable;
          ADOTable1->Active = false;
          ADOTable1->Active = true ; //ein/Ausschalten um die Table zu wechseln
      }
      catch(...)
      {
        ShowMessage("ERROR->Sql2DB");
      }
    }
    
    void __fastcall Tmod_DBase_con::GetTableValues(AnsiString SourceTable, /*AnsiString SourceFiel,*/ AnsiString CommandText, TStrings * dest)
    {
      vector<AnsiString> SourceFields(1);
      //AnsiString SourceField;
      AnsiString tmpTable = "";
      AnsiString tmpSrc = "";
      try
      {
          tmpTable = ADOTable1->TableName;
          ADOTable1->TableName = SourceTable;
          ADOTable1->Active = false;
          ADOTable1->Active = true ; //ein/Ausschalten um die Table zu wechseln
          ADOQuery1->ConnectionString = ADOConnection1->ConnectionString;
          ADOQuery1->SQL->Clear();
          ADOQuery1->SQL->Add(CommandText);
          ADOQuery1->Active = true;
    
          ADOQuery1->Open();
          SourceFields[0] = mod_DBase_con->SqlZellen; //CommandText;
          //dest->Add(mod_DBase_con->ADOQuery1->FieldByName(SourceField)->AsString );
          if ( SourceFields[0].Pos(",") ) //prüfung ob es mehrere Zellen sind
          {
            AnsiString tmpStr = SourceFields[0];
    
            SourceFields[0] = "";
            SourceFields.resize(0);
            while( tmpStr.Pos(",") )
            {
              SourceFields.push_back( tmpStr.SubString(1,tmpStr.Pos(",")-1) );
              tmpStr.Delete(1,tmpStr.Pos(",")+1);
              tmpSrc += ""+SourceFields.at( SourceFields.size()-1 )+"\t";
            }
    
            SourceFields.push_back( tmpStr );
            tmpSrc += tmpStr;
    
            dest->Add(tmpSrc);
          }
          else
          {
            dest->Add(SourceFields[0]);
          }
    
          AnsiString xtmp2 = "";
          mod_DBase_con->ADOQuery1->First();
          for ( int i = 0; i < mod_DBase_con->ADOQuery1->RecordCount; i++)
          {
            for( int v = 0; v < SourceFields.size(); v++ )
            {
              xtmp2 += AnsiString(mod_DBase_con->ADOQuery1->FieldByName(SourceFields.at(v))->AsString )+"\t";
            }
            mod_DBase_con->ADOQuery1->Next(); //091943?10?
            dest->Add(xtmp2);
            xtmp2 = "";
          }
          mod_DBase_con->ADOQuery1->Active = false;
          ADOTable1->TableName = tmpTable;
          ADOTable1->Active = false;
          ADOTable1->Active = true ; //ein/Ausschalten um die Table zu wechseln
      }
      catch(...)
      {
        ;
      }
    }
    

    der aufruf findet folgendermaßen statt:

    mod_DBase_con->GetTableValues(TableListBox->Items->Strings[ TableListBox->ItemIndex ],
                                      /*cbx_Tabelle->Text,*/Edit1->Text, RichEdit1->Lines  );
    
    AnsiString sqlerg = mod_DBase_con->Sql2DB(DBTabelle,Feld,"SELECT ID FROM "+DBTabelle+" where "+Feld+"='"+Artikel+"'");
    

    was kann da nicht stimmen? 😕

    mfg LordPsycho



  • Hi,

    ich hab' mir den Code nicht im Detail angesehen, aber viele Probleme lösen sich von selbst, wenn man auf die Verwendung von TxxxTable-Komponenten verzichtet. Abgesehen von TTable in Verbindung mit Paradox oder dBase macht der Einsatz von Tablekomponenten sowieso keinen Sinn. Alle Komponenten wie TADOTable oder TIBTable usw. sind meiner Erfahrung nach wenig mehr als Marketingkrücken. Sie funktionieren unzuverlässig und mit teilweise recht obskuren, nicht nachvollziehbaren Ergebnissen. Sogar die Hersteller raten im Regelfall von der Verwendung ab. Ihre Daseinsberechtigung ergibt sich aus der Notwendigkeit ein bestehendes Programm mit BDE und TTable ohne große Aufwand auf z.B. ADO umstellen zu können. Meiner Erfahrung nach funktioniert das aber im Regelfall nur mit Einschränkungen und einer Reihe 'lustiger' Nebeneffekte.



  • hab den Fehler gefunden,
    kommt davon wenn man einfach kopiert ohne großartig nach zu denken 😃



  • Es gehört zum guten Ton, auch selbstgefundene und/oder triviale Lösungen bekanntzugeben.



  • könntes du noch sagen was der fehler gewesen ist und was mod_Dbase_con für ein element ist??
    🙄

    vielen dank


Anmelden zum Antworten