C++ Fehler beim Erstellen von Cursor-Handle

$ch4pse

Lt. Junior Grade
Registriert
Feb. 2007
Beiträge
390
Hi Leute,

Ich programmier grad für n Kumpel n kleines Programm mit ner SQL-Datenbank drin(auf dem Borland C++Builder 5). Das soll man nen neuen Benutzer anlagen können. Das mach ich mit nem normalen Query und folgendem Befehl:
Code:
INSERT INTO container 
(Name,Getränke,offen,Gesamt)
VALUES ('Karle',0,0,0)

Nur leider spuckt mir mein C++Builder immer die Meldung aus "Fehler: Fehler beim Erstellen von Cursor-Handle"

was mache ich falsch? Habe es scho mit Query1->open() und Query1->ExecSQL()
versucht beides mal kommt der selber Fehler.
Hoffe ihr könnt mir helfen
Gruß Phil
 
Das Statement an sich sieht in Ordnung aus.

Wie rufst du das ganze auf?
 
Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->Active = false;
Query1->SQL = Memo1->Lines;
Query1->Active = true;
Query1->ExecSQL();
}

Anmerkung: Das im ersten Beitrag genannte SQL-Statement wird direkt aus der Memo1 entnommen, aus dem Grund dass man damit auch andere SQL-Befehle können soll.
 
Der Fehler liegt vermutlich darin, dass du Active auf true setzt und danach execSQL ausführst.

Wenn ich mich recht erinnere, dann wird das vorhandene Statement ausgeführt, wenn Active auf true gesetzt wird. Wenn du danach execSQL ausführst, ohne Query1 geschlossen zu haben, gibt's den Fehler.
 
normalerweise gibt borland doch immer sehr gute beispiele an, auch für jegliche komponenten. gibts dazu denn kein vernünftiges beispiel (was ich mir schwer vorstellen kann)? geh einfach mal auf das ExecSQL() und drück f1, ggf. solltest du dir die komponente inkl. der funktion bzw. eigenschaft selbst heraussuchen.
 
Jo klar die Borland hilfe is scho recht gut nur leider hat mir die in dem Fall auch nix geholfen. Habs mit dem ExecSQL vor dem Active= true versucht, bringt aber leider auch nix, der Fehler taucht weiterhin auf.
Habt ihr noch ne andere Idee an was das liegen kann?
 
$ch4pse schrieb:
Habt ihr noch ne andere Idee an was das liegen kann?
geh mal anders an die sacher heran: wenn du über google nix findest, versuch es eben mal mit dem stichwort delphi. die vcl wird ja im bcb, sowie in delphi genutzt. d.h. dass beide sachen die gleiche syntax besitzen.
aus folgendem hab ich mal folgende seite gefunden: http://delphi.about.com/od/database/l/aa060199.htm dort wird u.a. so für einen query vorgegangen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;{close the query}
//assign new SQL expression
Query1.SQL.Clear;
Query1.SQL.Add ('Select EmpNo, FirstName, LastName');
Query1.SQL.Add ('FROM Employee.db');
Query1.SQL.Add ('WHERE Salary > ' + Edit1.Text);
Query1.RequestLive := true;
Query1.Open; {open query + display data}
end;
wichtig hierbei ist natürlich nicht die syntax, die zu c++ natürlich unterschiedlich ist, sondern wie die vorangehensweise der vcl ist und welche schritte gemacht werden müssen. heißt hier also: löschen per clear(), hinzufügen per add() und öffnen per open(). wenn das nicht funktioniert, versuch einfach mal mehr via google zu finden. das stichwort delphi hat mir zumindest immer mal mehr weitergeholfen, als sonstige suchen.
 
Welche Komponenten benutzt du denn? Was für eine Datenbank hängt dahinter? Alle Updates für den Builder eingespielt? Funktionieren normale DB-Controls? DBGrid meinetwegen. Dann siehst du schonmal, ob es an deinem Code oder der Datenbindung liegt.
 
Danke claw werd ich mal versuchen

@7H3 N4C3R: updates sind alle drin. Es hängt ne Paradox 7 Datenbank dahinter die auch in nem DBGrig problemlos funktioniert und auch die anderen Steuerungen klappen, ich möchte das Programm eben nur so einfach wie möglich schreiben dass keiner der damit arbeitet was kaputt machen kann, drum sollte ein klick auf "neuen benutzer anlegen" nur ne EditBox sichtbar machen wo man dann den Namen einträgt, den Rest mach mein C++Builder xD
 
Mit welchen DB-Komponenten genau arbeitest du denn?

TQuery, TDatabase & Co.? (BDE) Oder DBX? Oder irgendetwas anderes? Das wäre evtl auch hilfreich. Erzeugst du die Query zur Laufzeit? Gehen dabei dann vielleicht einstellungen flöten?

Wenn du ein Insert absetzt, brauchst du natürlich kein Cursor-Handle, von daher würde ich mal auf Komponenteneinstellungen tippen. Bei Aufrufen, die keine Datenmenge zurückgeben, immer ExecSQL() verwenden, während man für Datenmengen Open() braucht. Und vorher natürlich kein Active auf true setzen. ;) Das macht afair ein Open(), was u.U. verkehrt sein kann.
 
Jo ich arbeite mit BDE. Der Query ist schon drin und zu Programmbeginn auch schon aktiv, und soll über den Buttonclick nur verändert werden damit er einen anderen Zweck erfüllt(zum programmstart zeigt der nur nen SELECT an um die einige Attribute der Tabelle auszublenden). Dann soll er mit einem Buttonclick verändert werden und einen Datensatz hinzufügen
 
Mein Tipp wäre in dem Fall, zur Designzeit (in der IDE) die Eigenschaft Active auf false zu lassen. Im OnCreate-Ereignis der Form kannst du dann mit execSQL(), bzw open() das erste Statement aufrufen.
Für weitere Statements kannst du dann wieder mit execSQL() und open() arbeiten, je nachdem, was für ein Statement im Memo steht.
In jedem Fall solltest du bei diesem Vorgehen die Eigenschaft Active nicht anfassen.
 
Zurück
Oben