Anfängerprobleme mit Borland C++ und MySQL
-
hallo,
ich befaß mich derzeit mit mysql und wollte nun mal mysql in Verbindung mit C++ ausprobieren, da man von dort auch SQL-Befehle ausführen kann und das Ergebnis in ein Fenster anzeigen lassen kann. Also hab ich vom Anfangskapitel einen einfachen SQL Befehl genommen, diesen in Verbindung mit dbExpress ausführen lassen.
Ziel ist es, von den 4 Tools von Borland, jedes mal auszuprobieren in Verbindung mit MySQL, welches für einfache Datenbankabfragen am besten geeignet ist.ÜBERSICHT ZU DEN TOOLS ANFANG
Hier die Übersicht von den 4 Tools
Datenbankanwendungen für die Win32-Plattform erstellenDatenbankanwendungen ermöglichen Benutzern, mit Informationen zu arbeiten, die in Datenbanken abgelegt sind. Datenbanken strukturieren die Informationen und ermöglichen, dass sie von unterschiedlichen Anwendungen gemeinsam genutzt werden können.
Delphi unterstützt relationale Datenbankanwendungen. Relationale Datenbanken speichern Informationen in Tabellen, die aus Zeilen (Datensätzen) und Spalten (Feldern) bestehen. Diese Tabellen können durch einfache Operationen bearbeitet werden, die auch als relationales Kalkül bezeichnet werden.
In diesem Abschnitt
Überblick zu dbGo
In diesem Thema werden die dbGo-Komponenten in der Tool-Palette beschrieben.Überblick zu dbExpress
Dieses Thema enthält einen Überblick über die dbExpress-Komponenten in der Tool-Palette.Überblick zu BDE
Dieses Thema enthält einen Überblick über die BDE-Komponenten in der Tool-Palette.Überblick zu DataSnap
ÜBERSICHT ZU DEN TOOLS ENDEAlso hab ich nach der folgenden Anleitung versucht das ganze aufzustellen:
ANLEITUNG ANFANG
Daten für die Anzeige mit TSQLDataSet festlegenSo bestimmen Sie die Daten, die angezeigt werden sollen:
Wählen Sie DateiNeuWeitere.
Das Dialogfeld Objektgalerie wird geöffnet.Wählen Sie im Dialogfeld Objektgalerie die Kategorie Neue Delphi-Projekte, und doppelklicken Sie dann auf VCL-Formularanwendung.
Der Windows-Designer wird angezeigt.Ziehen Sie aus der Kategorie dbExpress der Tool-Palette eine TSQLDataSet-Komponente in das Formular.
Legen Sie im Objektinspektor über die Eigenschaft TCustomSQLDataSet.CommandType den Typ der unidirektionalen Datenmenge für TSQLDataSet fest.
Geben Sie an, ob die Informationen aus den Ergebnissen einer Abfrage, einer Datenbanktabelle oder einer Stored Procedure stammen.
So zeigen Sie die Ergebnisse einer Abfrage an:Weisen Sie der Eigenschaft TCustomSQLDataSet.CommandType einer TSQLDataSet-Komponente den Wert ctQuery zu.
Ziehen Sie für TSQLQuery eine TSQLQuery-Komponente aus der Tool-Palette in das Formular.
Weisen Sie der Eigenschaft TQuery.SQL die Abfrage zu, die verwendet werden soll.
Wählen Sie die TSQLDataSet-Komponente aus.
Klicken Sie auf die Eigenschaft TCustomSQLDataSet.CommandText .
Der Anweisungstext-Editor wird geöffnet.Weisen Sie im Anweisungstext-Editor der Eigenschaft TQuery.SQL den Text der Abfrageanweisung zu.
Hinweis:
Die von Ihnen formulierte Abfrage kann Parameter oder Variablen enthalten, deren Werte zur Entwurfszeit oder zur Laufzeit geändert werden können. Parameter können in der SQL-Anweisung enthaltene Datenwerte ersetzen. SQL definiert auch Abfragen, wie beispielsweise UPDATE-Abfragen, die Aktionen auf dem Server ausführen, aber keine Datensätze zurückgeben.So zeigen Sie Datensätze in einer Tabelle an:
Weisen Sie im Objektinspektor der Eigenschaft TCustomSQLDataSet.CommandType den Wert ctTable zu.
TSQLDataSet erzeugt eine Abfrage, die auf den Werten der folgenden beiden Eigenschaften basiert: TCustomSQLDataSet.CommandText legt den Namen der Datenbanktabelle fest, die das TSQLDataSet-Objekt darstellen soll. TCustomSQLDataSet.SortFieldNames gibt die Namen der Felder an, nach denen die Daten sortiert werden sollen.Ziehen Sie eine TSQLTable-Komponente in das Formular.
Weisen Sie im Objektinspektor der Eigenschaft TTable.TableName die gewünschte Tabelle zu.
Um die Reihenfolge der Felder in der Datenmenge festzulegen, weisen Sie der Eigenschaft TTable.IndexName den Namen eines auf dem Server definierten Index zu. Alternativ können Sie der Eigenschaft TTable.IndexFieldNames eine mit Strichpunkt getrennte Liste von Feldnamen zuweisen.
So zeigen Sie die Ergebnisse einer Stored Procedure an:Weisen Sie im Objektinspektor der Eigenschaft TCustomSQLDataSet.CommandType den Wert ctStoredProc zu.
Geben Sie den Namen der Stored Procedure als Wert der Eigenschaft TCustomSQLDataSet.CommandText an:
Weisen Sie der Eigenschaft TSQLStoredProc.StoredProcName den Namen der Stored Procedure für TSQLStoredProc zu.
Hinweis:
Nachdem Sie eine Stored Procedure angegeben haben, muss Ihre Anwendung möglicherweise Werte für die Eingabeparameter der Stored Procedure bereitstellen oder die Werte von Ausgabeparametern ermitteln, nachdem die Stored Procedure ausgeführt worden ist.
ANLEITUNG ENDEDas Ergebnis sieht dann so aus:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 292
ClientWidth = 450
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object SQLConnection1: TSQLConnection
ConnectionName = 'MySQLConnection'
DriverName = 'MySQL'
GetDriverFunc = 'getSQLDriverMYSQL'
LibraryName = 'dbxmys30.dll'
LoadParamsOnConnect = True
Params.Strings = (
'BlobSize=-1'
'Database=sql_grundlagen'
'DriverName=MySQL'
'ErrorResourceFile='
'HostName=localhost'
'LocaleCode=0000'
'Password=amen'
'User_Name=root'
'Compressed=False'
'Encrypted=False')
VendorLib = 'LIBMYSQL.dll'
AfterConnect = SQLConnection1AfterConnect
Connected = True
Left = 24
Top = 16
end
object SQLDataSet1: TSQLDataSet
SchemaName = 'sql_grundlagen'
CommandText = 'SELECT * FROM kunden;'
MaxBlobSize = -1
Params = <>
SQLConnection = SQLConnection1
Left = 88
Top = 16
end
object SQLQuery1: TSQLQuery
MaxBlobSize = -1
Params = <>
SQL.Strings = (
'SELECT * FROM kunden;')
SQLConnection = SQLConnection1
Left = 176
Top = 16
end
object SQLTable1: TSQLTable
MaxBlobSize = -1
SQLConnection = SQLConnection1
TableName = 'kunden'
Left = 280
Top = 16
end
endIch werde zwar aufgefordert das Paßwort für den MySQL-Server einzugeben, damit die Verbindung hergestellt wird, aber dannach passiert garnix.
Was mach ich da falsch, ist die Beschreibung vielleicht lückenhaft und es wurden nicht alle Schritte und Befehle erläutert?
-
ähm, ja...
das dfm-Formular interessiert eigentlich weniger...
wie wäre es denn mal mit "richtigem" Code?
-
hab mir mal die Doku durchgeschaut, war leider kein Beispiel da, wo man von Anfang bis Ende sowas aufgezeigt bekommt ...
naja hier der Code den ich mir selber zusammengesucht hab.//--------------------------------------------------------------------------- // Hier werden nach und nach alle 4 Datenbanktools von Turbo C++ getestet ;o #include <vcl.h> #pragma hdrstop #include "DatabaseTestArea.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::SQLConnection1AfterConnect(TObject *Sender) { int test = 0; test++; // Wird ausgeführt SQLQuery1->SQL->Add("SELECT * FROM kunden;"); SQLQuery1->Open(); /* Hier sollte die SQL Anweisung von oben ausgeführt werden */ /* Hier kommt später der Teil hin, wo ich irgendwie mit irgendein Borland Befehl das Ergebnis der Abfrage rausziehen kann. */ } //--------------------------------------------------------------------------- void __fastcall TForm1::SQLDataSet1AfterOpen(TDataSet *DataSet) { int test=0; test++; // Wird nicht ausgeführt } //---------------------------------------------------------------------------Dann kommt aber diese Fehlermeldung, obwohl ich im SQL Befehl an ; hinten hab, hab es auch ohne ausprobiert und mit Leerzeichen aber es geht einfach nix...
Datenbank-Server-Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
SELECT * FROM kunden' at line 1'. Prozess Kompass_DatabaseTestArea.exe (2032)
-
ein paar Felder hab ich nun dazu genommen damit das ganze schonmal dynamischer wird, die Abfrage wird erst nach den Click Ereignis von den neuen Button gestartet, allerdings bringt die Abfrage immernoch den merkwürdigen fehler auch mit Variablen ..
//--------------------------------------------------------------------------- // Hier werden nach und nach alle 4 Datenbanktools von Turbo C++ getestet ;o #include <vcl.h> #pragma hdrstop #include "DatabaseTestArea.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TDatensatz *Datensatz; //--------------------------------------------------------------------------- __fastcall TDatensatz::TDatensatz(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TDatensatz::SQLConnection1AfterConnect(TObject *Sender) { } //--------------------------------------------------------------------------- void __fastcall TDatensatz::SQLDataSet1AfterOpen(TDataSet *DataSet) { } //--------------------------------------------------------------------------- void __fastcall TDatensatz::StarteTestClick(TObject *Sender) { SQLQuery1->SQL->Add("SELECT * FROM " + Relation->Text + ";"); SQLQuery1->Open(); /* Hier sollte die SQL Anweisung von oben ausgeführt werden */ Datensatz->Text = SQLQuery1->SQL; } //---------------------------------------------------------------------------
-
Schau doch mal ob du in deiner Query schon nen SQL drin stehen hast ... sieht nämlich so aus nach dem DFM zu urteilen.
Dann hast du nach deinem Button Click nämlich zwei SQLs drin stehen. Einer zuviel.
Mach einfach mal nur ein Open() ohne Add() oder mach ein Clear() vor dem Add().Ach ja ... und schau auch sicherheitshalber mal nach ob die Tabelle in deiner Datenbank auch existiert

-
ja das war es tatsächlich, Danke
, hab jetzt erstmal den Eintrag aus der .dfm Datei belassen, da das ganze ja noch ziemlich am Anfang ist.
Leider kommt da jetzt eine andere Fehlermeldung:
Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00C4B960 in Modul 'dbxmys30.dll'. Lesen von Adresse 00000006'. Prozess SQL_DatabaseTestArea.exe (408)//--------------------------------------------------------------------------- // Hier werden nach und nach alle 4 Datenbanktools von Turbo C++ getestet ;o #include <vcl.h> #pragma hdrstop #include "DatabaseTestArea.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TDatensatz *Datensatz; //--------------------------------------------------------------------------- __fastcall TDatensatz::TDatensatz(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TDatensatz::StarteTestClick(TObject *Sender) { // SQLQuery1->SQL->Add("SELECT * FROM " + Relation->Text + ";"); SQLQuery1->Open(); /* Hier sollte die SQL Anweisung von oben ausgeführt werden */ /* Bei Ausführung kommt folgender Fehler Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00C4B960 in Modul 'dbxmys30.dll'. Lesen von Adresse 00000006'. Prozess SQL_DatabaseTestArea.exe (408) */ // Hier wird dem Textfeld Datensatz das Ergebnis der Abfrage zugewiesen // Datensatz->Text = SQLQuery1->SQL->Text; SQLQuery1->SQL->Clear(); // Für die nächste Abfrage vorbereiten } //---------------------------------------------------------------------------
-
kann es vielleicht auch an der Version von MySQL liegen und garnicht mit Borland Turbo C++ kompatibel ist? hat die Version 5
-
moin,
der Daten-Explorer bei Turbo C++ zeigt auch keine Tabellen an, aber die Verbindung steht
habe auch probiert einfach mal Datenbanken einzugeben die es nicht gibt, da kommt "Verbindung fehlgeschlagen" - nun weiß ich echt nicht mehr weiter wo der Fehler sein könnte, wenn zwar bei der Datenbank "sql_grundlagen" die Verbindung hinhaut, aber trotz, daß dort Tabellen drinnen sind, keine angezeigt werden 