Connexion mysql et recuperation dans base access

Soyez le premier à donner votre avis sur cette source.

Vue 12 550 fois - Téléchargée 3 132 fois

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

Ajouter un commentaire

Commentaires

Messages postés
133
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
16 juin 2020

Ma connexion me permet de me connecter sur un serveur d'une filiale au Portugal, et de récupérer des données pour traitement je fait un transfert dans une base access, mais on peut tres bien bien faire un transfert dans excel, ascii etc... en modifiant les lignes de 135 a 144.

En gros si tu veux faire joujou, tu joue sur ligne 106, 107 et 135 a 144.
Messages postés
9
Date d'inscription
vendredi 7 février 2003
Statut
Membre
Dernière intervention
3 octobre 2009

Bonjour
OK ça marche super (wamp,localhost , mysql, création d'une base , d'une table ,
ça tourne avec delphi etc..)
j'ai tout compris , enfin presque , et access dans tout ça?
Messages postés
133
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
16 juin 2020

Bonjour,
As-tu configurer les base mysql : http://localhost/phpmyadmin/
Onglet Base de Donnees creer une base ex : Mabase
Onglet SQL Creer la tables produits : Copier Structure de la table `produit` du fichier "Base_MySQL.txt" fourni dans zip puis Executer
Onglet SQL Remplir de quelques donnees : Copier Contenu de la table `produit` toujours dans le fchier Base_MySQL.txt puis Executer

Voila une fois que tu as fais :
une database : Mabase
une base : produit
et rempli la table

Tu lance le soft :
Host : localhost
login : root
pass ne rien mettre :
base : Mabase
table : produit

Clic sur recuperer base
Messages postés
9
Date d'inscription
vendredi 7 février 2003
Statut
Membre
Dernière intervention
3 octobre 2009

bonjour
j'ai installé wampserver et mysql 5.1.39 et quand je lance le programme , message erreur
'unknown database 'base' ' ???
Je pige pas
Salut
Messages postés
12
Date d'inscription
vendredi 24 janvier 2003
Statut
Membre
Dernière intervention
8 février 2010

Bonjour,
Il existe des composant pour accédé directement au base de données : c'est la Zeoslib : http://zeos.firmos.at/
Les base reconnues sont :
# ADO
# Mysql 4.1 to 6.0,
# Interbase 5 / 6
# Firebird 1.0 to 2.1
# Postgres 7 to 8
# SQLite 2.8 to 3
Ils t'aideront peux être dans tes prochaines applications.. Ce que je trouve bien dans ses composant entre autre c'est qu'il sont simple d'emplois et il peuvent par exemple utiliser le MySql embarquer...
Afficher les 7 commentaires

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.