Hallo Zusammen,
ich bin leider noch nicht wirklich weitergekommen mit meinen Bemühungen, mit Delphi xe2 starter auf eine
MySQL-Datenbank zugreifen zu können.
Das ganze soll ohne Komponenten möglich sein.
Vielleicht hat jemand das Thema schon gelöst - ich habe aber noch nichts gefunden...
Angedacht sind drei Prozeduren/Funktionen: Connect, ExecQuery und disconnect.
Nachstehend was ich bis hierhin gefrickelt habe, in der Hoffnung, dass wir es hier dann zum Laufen bringen...
KOPF:
Delphi-Quellcode:
unit DBconnectUnit;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.Grids,
Vcl.StdCtrls,
mysql;
type
TForm1 =
class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TRows =
array of array of string;
// [Cols, Rows]
TCols =
array of string;
var
Form1: TForm1;
LibHandle: PMYSQL;
mySQL_Res: PMYSQL_RES;
ErrorCode: Integer;
ColCount: integer;
AffectedRows: Int64;
host, User, Pass,
DB: Ansistring;
implementation
{$R *.dfm}
CONNECT:
Delphi-Quellcode:
procedure connect;
var
MYSQL_ROW: PMYSQL_ROW;
Datei: TextFile;
MyString:
String;
begin
libmysql_fast_load(
nil);
AssignFile(Datei, ExtractFilePath(Application.ExeName) + '
SQL.set');
Reset(Datei);
try
ReadLn(Datei, MyString);
host := copy(MyString, pos('
:', MyString)+1, length(MyString));
ReadLn(Datei, MyString);
User := copy(MyString, pos('
:', MyString)+1, length(MyString));
ReadLn(Datei, MyString);
Pass := copy(MyString, pos('
:', MyString)+1, length(MyString));
ReadLn(Datei, MyString);
DB := copy(MyString, pos('
:', MyString)+1, length(MyString));
finally
CloseFile(Datei);
end;
if mySQL_Res<>
nil
then
mysql_free_result(mySQL_Res);
mySQL_Res :=
nil;
if LibHandle<>
nil
then begin
mysql_close(LibHandle);
LibHandle :=
nil;
end;
LibHandle := mysql_init(
nil);
if LibHandle=nil
then
raise Exception.Create('
mysql_init failed');
if (mysql_real_connect(LibHandle,
PAnsiChar(AnsiString(Host)),
PAnsiChar(AnsiString(User)),
PAnsiChar(AnsiString(Pass)),
PAnsiChar(AnsiString(
DB)),
3306,
nil, 0)=nil)
then
raise Exception.Create(mysql_error(LibHandle));
end;
EXECQUERY:
Delphi-Quellcode:
function ExecQuery(
const Datenbank,
query:
string;
var Cols: TCols;
var Rows: TRows): Boolean;
var
j, i, field_count, row_count: Integer;
mySQL_Field: PMYSQL_FIELD;
tablename:
String;
MYSQL_ROW: PMYSQL_ROW;
begin
SetLength(Cols, 0);
// Datenbank auswählen
ErrorCode := mysql_select_db(LibHandle, PAnsiChar(AnsiString(Datenbank)));
if ErrorCode = 0
then
begin
// Query ausführen
if mysql_real_query(LibHandle, PAnsiChar(
query), Length(
query))<>0
then begin
raise Exception.Create(mysql_error(LibHandle));
exit;
end
else
begin
// Query speichern
mySQL_Res := mysql_store_result(LibHandle);
if mySQL_Res<>
nil
then begin
// zurückgelieferte Anzahl der Spalten
ColCount := mysql_num_fields(mySQL_Res);
SetLength(Cols, ColCount);
SetLength(Rows, ColCount, 0);
SetLength(Cols, ColCount);
// Spalten-Array füllen
for i := 0
to ColCount - 1
do
begin
mySQL_Field := mysql_fetch_field_direct(mySQL_Res, i);
Cols[i] := mysql_field_name(mySQL_Field);
end;
// Anzahl der betroffenen Zeilen ermitteln
AffectedRows := mysql_num_rows(mySQL_Res);
SetLength(Rows, ColCount, AffectedRows);
// neu ->
// Zeilen-array füllen
// alle Zeilen ...
for j := 0
to AffectedRows - 1
do
begin
// ... werden eingelesen
MySQL_Row := mysql_fetch_row(mySQL_Res);
// alle Spalten ...
for i := 0
to ColCount - 1
do
begin
// ... werden in Rows[] übertragen
Rows[i, j] := MySQL_Row[i];
end;
end;
// gespeicherte Abfrage wieder freigeben
mysql_free_result(MySQL_Res);
end
end
end;
result := ErrorCode = 0;
end;
DISCONNECT:
Delphi-Quellcode:
procedure disconnect;
begin
mysql_close(LibHandle);
LibHandle := nil;
if mySQL_Res<>nil
then
mysql_free_result(mySQL_Res);
if libmysql_status=LIBMYSQL_READY
then
mysql_close(LibHandle);
libmysql_free;
end;
AUFRUF:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
query: Ansistring;
Cols: TCols;
Rows: TRows;
begin
query:='
select * from as400';
connect;
ExecQuery(
db,
query, Cols, Rows);
disconnect;
FillGrid(StringGrid1, Cols, Rows);
end;
Im Moment passiert Folgendes:
Beim ausführen bekomme ich eine Fehlermeldung, dass ich einen Fehler in meinem
SQL-Syntax hätte. Das ist nicht der Fall, denn wenn ich den Wert aus der Variablen "
query" in dem
MySQL-Server direkt ausführe funktioniert es...
Der Fehler wird in der
MySQL.pas erzeugt, in dieser Prozedure:
Delphi-Quellcode:
function mysql_error(_mysql: PMYSQL): PAnsiChar;
begin
if @_mysql_error=nil
then
LoadProcAddress(@_mysql_error, 'mysql_error');
Result := _mysql_error(_mysql);
end;
Die Fehlermeldung lautet:
Zugriffsverletzung bei FFFEB4E8 und Zugriff auf FFFEB4E8
Delphi-Übersetzung:
Im Projekt DBconnect ist eine
Exception der Klasse
Exception mit der Meldung 'You have an error in your
MySQL-Syntax; check manual ...
Ich bewege mich mit dieser Sache auf zu dünnem Eis und bin auf Hilfe angewiesen. Kann mir jemand helfen, wie ich auf diese Weise die Verbindung zu meinem
MySQL-Server hinbekomme?
Vielen Dank im Voraus
Ykcim