Announcement

Collapse
No announcement yet.

Alternative zu AdoQuery->GeftFieldNames

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Alternative zu AdoQuery->GeftFieldNames

    Hallo zusammen,

    ich habe eine Dll zur Verwaltung von Datenbanken geschrieben. Alles funktioniert außer das Abfragen der Spaltennamen macht Probleme. Der Code sieht im Wesentlichen wie folgt aus :
    Code:
    //...
    TStringList* Liste=new TStringList();
    this->ADOQuery->GetFieldNames(Liste);
    //...
    Wenn ich die DLL und die aufrufende Exe ohne Laufzeitpackages linke (also unter Projekt->Optionen->Packages->'Laufzeitpackages verwenden' den Haken setze) funktioniert alles ohne Probleme. Nehme ich für die endgültige Version den Haken raus (damit die dll auch auf PC's ohne BCB läuft) bekomme ich beim Aufruf von GetFieldNames die Exception:

    'TFieldList kann nicht zu TStringList zugewiesen werden'

    Ich arbeite mit Codegear C++ Builder 2007 (WIN XP SP3)und habe das auch schonmal neu installiert -> das Problem bleibt.

    Kann mir jemand helfen? Bin am Ende. Am einfachsten wäre wohl eine Alternative zu dem Befehl.

    Danke im Voraus

  • #2
    Originally posted by Seb81 View Post
    Nehme ich für die endgültige Version den Haken raus (damit die dll auch auf PC's ohne BCB läuft) bekomme ich beim Aufruf von GetFieldNames die Exception:

    'TFieldList kann nicht zu TStringList zugewiesen werden'
    As Designed. Willst du eine DLL verwenden die Nachfahren von TObject verwendet (also irgendein Objekt) so muss Exe+DLL mit Laufzeitpackages kompiliert werden.
    Liegt daran das Exe.TObject != Dll.TObject. Entweder Laufzeitpackages mit Objekten als DLL-Schnittstelle oder eine C-Kompatible DLL-Schnittstelle.

    Comment


    • #3
      Liegt daran das Exe.TObject != Dll.TObject. Entweder Laufzeitpackages mit Objekten als DLL-Schnittstelle oder eine C-Kompatible DLL-Schnittstelle.
      Danke erstmal, aber der von mir dargestellte Quellcode ist nur ein Ausschnitt innerhalb einer Funktion in der Dll. Die Schnittstelle der DLL bzw. der Funktion ist absolut sauber, d.h. es werden nur Variablen vom Typ char* oder int übergeben. Die Verwendung von Nachfahren von TObject innerhalb der DLL sollte doch eigentlich problemlos sein.
      Nochmal die Architektur in Kürze :
      - Die Schnittstelle der DLL bildet die Unit "DbAPI_Main.cpp". Hier sind alle zu exportierenden Funktionen aufgelistet.
      Die betreffende Funktion sieht hier wie folgt aus :
      Code:
      extern "C" __declspec(dllexport) char* GetSpaltenName(int Index)
      {
         AnsiString ReturnString=DBObject->GetSpaltenname(Index); 
         return ReturnString.c_str();
      }
      DBObject ist dabei ein Object der Klasse XDBSpalte welches in der unit global deklariert ist. Die entsprechende Funktion in der Klasse sieht dann wie folgt aus

      Code:
      AnsiString XDBSpalte::GetSpaltenname(int Index)
      {
      	TStringList* Liste=new TStringList();
      	this->ADOQuery->GetFieldNames(Liste);
      
      	if((Index>-1)&(Index<Liste->Count))
      	{
      		AnsiString Value=Liste->operator [](Index);
      		delete Liste;
      		return Value;
      	}
      	else
      	{
      		this->ShowError("XDBSpalte","GetSpaltenname","Ungültiger Index");
      		delete Liste;
      		return "NULL";
      	}
      }
      Haste sonst vielleicht noch Ideen woran es liegen könnte?

      Comment

      Working...
      X