Un bout de code simple, connexion à MySQL, et récupération dans une base Access
Je devais récupérer des données d'une base mySQL, et comme TSQLconnexion ne marche pas chez moi, j'ai du opter pour une autre solution.
j'utilise une unité MySql.pas mise a jour 04-Aug-2009 et bien sur libmysql.dll.
Source / Exemple :
unit FFiche;
interface
uses
Windows, Classes, Graphics, Controls, Forms, SysUtils, DB, ADODB,
Grids, DBGrids, ComCtrls, StdCtrls, ExtCtrls, mysql, Buttons, Inifiles;
type
TFiche = class(TForm)
StatusBar: TStatusBar;
DS_1: TDataSource;
ADOConnect: TADOConnection;
QUERY_RECUP: TADOQuery;
DBG_RESULTAT: TDBGrid;
BT_Transert: TButton;
BT_Vider: TButton;
ED_HOST: TLabeledEdit;
ED_LOGIN: TLabeledEdit;
ED_PASS: TLabeledEdit;
ED_BASE_DISTANTE: TLabeledEdit;
ED_TABLE: TLabeledEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CONNECTION_Serveur;
procedure BT_TransertClick(Sender: TObject);
procedure DBG_RESULTATDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure BT_ViderClick(Sender: TObject);
private
LibHandle: PMYSQL;
mySQL_Res: PMYSQL_RES;
public
end;
var
Fiche: TFiche;
NB_Eng: Integer;
INI: TInifile;
implementation
{$R *.dfm}
procedure TFiche.FormCreate(Sender: TObject);
begin
// Chargement Parametre serveur MySQL
INI := TIniFile.Create(ExtractFilePath(Application.Exename) +
'\Parametre.ini');
ED_HOST.Text := INI.ReadString('PARAMETRE', 'HOST', 'erreur');
ED_LOGIN.Text := INI.ReadString('PARAMETRE', 'LOGIN', 'erreur');
ED_PASS.Text := INI.ReadString('PARAMETRE', 'PASS', 'erreur');
ED_BASE_DISTANTE.Text := INI.ReadString('PARAMETRE', 'BASE_DISTANTE',
'erreur');
ED_TABLE.Text := INI.ReadString('PARAMETRE', 'TABLE', 'erreur');
//------------------------------------------------------------------------------
// Vous pouvez changer chemin dan parametre.ini
ADOConnect.ConnectionString := 'Provider=MSDASQL.1;'
+ 'Persist Security Info=False;'
+ 'Extended Properties="DSN=MS Access Database;'
+ 'DBQ=' + INI.ReadString('PARAMETRE', 'BASE_LOCALE', 'erreur')
+ ';DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"';
//------------------------------------------------------------------------------
QUERY_RECUP.SQL.Add('Select * From VIDE');
//------------------------------------------------------------------------------
ADOConnect.Connected := True;
//------------------------------------------------------------------------------
libmysql_fast_load(nil);
end;
procedure TFiche.FormDestroy(Sender: TObject);
begin
// Enregistrement Parametre serveur MySQL
INI := TIniFile.Create(ExtractFilePath(Application.Exename) +
'\Parametre.ini');
INI.WriteString('PARAMETRE', 'HOST', ED_HOST.Text);
INI.WriteString('PARAMETRE', 'LOGIN', ED_LOGIN.Text);
INI.WriteString('PARAMETRE', 'PASS', ED_PASS.Text);
INI.WriteString('PARAMETRE', 'BASE_DISTANTE', ED_BASE_DISTANTE.Text);
INI.WriteString('PARAMETRE', 'TABLE', ED_TABLE.Text);
//------------------------------------------------------------------------------
if mySQL_Res <> nil then mysql_free_result(mySQL_Res);
if libmysql_status = LIBMYSQL_READY then mysql_close(LibHandle);
libmysql_free;
end;
procedure TFiche.CONNECTION_Serveur;
var sql: AnsiString;
T_CHARGE: Cardinal;
row_count: Integer;
begin
if mySQL_Res <> nil then mysql_free_result(mySQL_Res);
LibHandle := mysql_init(nil);
if LibHandle = nil then raise Exception.Create('mysql_init failed');
if (mysql_real_connect(LibHandle,
PAnsiChar(AnsiString(ED_HOST.text)), // Serveur
PAnsiChar(AnsiString(ED_LOGIN.text)), // Login
PAnsiChar(AnsiString(ED_PASS.text)), // Pass
nil, 0, nil, 0) = nil) then raise Exception.Create(mysql_error(LibHandle));
//Get Databasenames
mySQL_Res := mysql_list_dbs(LibHandle, nil);
if mySQL_Res = nil then raise Exception.Create(mysql_error(LibHandle));
//----- BASE_DISTANTE
mysql_select_db(LibHandle, PAnsiChar(AnsiString(ED_BASE_DISTANTE.Text)));
//----- Connection Table
sql := 'Select REFE, FAM, FICHE, PRIX From ' // peut rajouter du where
+ QuoteName(PAnsiChar(AnsiString(ED_TABLE.text))); // Table
T_CHARGE := GetTickCount;
if mysql_real_query(LibHandle, PAnsiChar(sql), Length(sql)) <> 0
then raise Exception.Create(mysql_error(LibHandle));
if mySQL_Res <> nil then mysql_free_result(mySQL_Res);
//Get Data
mySQL_Res := mysql_store_result(LibHandle);
//Get Fieldnames
if mySQL_Res <> nil then row_count := mysql_num_rows(mySQL_Res);
// Mise a jour StatusBar -------------------------------------------------------
NB_Eng := row_count; // Compter pour recuperer base
Statusbar.Panels[0].Text := Format('Enregistrement: %d - Chargement: %d ms',
[row_count, (GetTickCount - T_CHARGE)]);
end;
procedure TFiche.BT_TransertClick(Sender: TObject);
var i: Integer;
MYSQL_ROW: PMYSQL_ROW;
begin
BT_Vider.Onclick(nil);
CONNECTION_Serveur; // connection serveur MySQL
if QUERY_RECUP.Active = False then QUERY_RECUP.Active := True;
for i := 1 to NB_Eng do
begin
if (NB_Eng > 0) and (NB_Eng <= mysql_num_rows(mySQL_Res)) then
begin
mysql_data_seek(mySQL_Res, NB_Eng - 1);
MYSQL_ROW := mysql_fetch_row(mySQL_Res);
if NB_Eng > 0 then // Verif qu'il y est des enregistrement a recuperer
begin
QUERY_RECUP.Insert;
QUERY_RECUP.Fieldbyname('REFE').AsString := MYSQL_ROW^[0];
QUERY_RECUP.Fieldbyname('FAM').AsString := MYSQL_ROW^[1];
QUERY_RECUP.Fieldbyname('DESIGN').AsString := MYSQL_ROW^[2];
QUERY_RECUP.Fieldbyname('PRIX').AsString := MYSQL_ROW^[3];
QUERY_RECUP.Post;
NB_Eng := NB_Eng - 1; // si zero stoppe limport
end;
end;
end;
end;
procedure TFiche.DBG_RESULTATDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
LargEcrit, HautEcrit: Integer;
begin
case DataCol of
2:
begin // Formatage colonne PRIX
LargEcrit := DBG_RESULTAT.Canvas.Textwidth(FormatFloat('0.00',
QUERY_RECUP.Fieldbyname('PRIX').Asfloat));
HautEcrit := DBG_RESULTAT.Canvas.Textheight(FormatFloat('0.00',
QUERY_RECUP.Fieldbyname('PRIX').Asfloat));
// alignement
DBG_RESULTAT.Canvas.Textrect(Rect, Rect.Right - LargEcrit - 2, Rect.Top +
((Rect.Bottom - Rect.Top - HautEcrit) div 2),
FormatFloat('0.00', QUERY_RECUP.Fieldbyname('PRIX').Asfloat));
end;
end;
end;
procedure TFiche.BT_ViderClick(Sender: TObject);
begin
// ouverture query
if QUERY_RECUP.Active = False then QUERY_RECUP.Active := True;
// Vider table
while not QUERY_RECUP.Eof do QUERY_RECUP.Delete;
end;
end.
Conclusion :
C'est mon premier code MySQL, ce n'est pas une raison pour ne pas casser, donc vous gêner pas je suis à l'écoute.
Inutile de laisser un message style je n'ai pas crypté le mot de pass.
Moi ce qui m'intéresse peut réduire le code, ou procédure plus rapide.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.