Connexion mysql et recuperation dans base access

Description

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.

Codes Sources

A voir également

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.