IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Transfert entre une base SQLserver et une base MySQL


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut Transfert entre une base SQLserver et une base MySQL
    Bonjour à tous,

    J'ai fouillé un peu et je ne trouve pas exactement la réponse à mon problème du moment, je ne suis pas sure de poster dans le bon topic n'hésitez pas a déplacer mon post.

    Je travaille actuellement sur un site web de gestion de données. Mon site est hébergé sur un serveur MySQL.

    Je dois récupérer des données situées sur un serveur SQLserver et cela via une procédure créée dans un fichier delphi.

    En gros je dois pouvoir updater ma BD MySQL en cliquant sur un bouton de mon logiciel développé sous Delphi avec des données situées sur SQLserver.

    Et là j'avoue que je bloque! Je ne vois pas du tout comment effectuer une requête SQL qui va chercher sur 2 bases de données différentes et situées sur 2 serveur complètement différents!

    J'ai essayé le module mysql fournit dans la FAQ de dvp, mais je n'ai pas réussi à le faire fonctionner, apparemment il y aurait un problème de version. Quelqu'un aurait un plugin facile à utiliser et fonctionnel?

    Une petite lumière me sortirai de ce trou noir

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Bonjour,

    le requête SQL ne pourra en effet pas atteindre les deux serveurs.

    L'application Delphi doit donc récupérer les enregistrements de SQLServer (SELECT) pour les envoyer sur MySQL (INSERT).

    Mais la base MySQL du site est-elle accessible à l'application Delphi ?

    Sur les sites Linux/PHP/MySQL l'accès au serveur MySQL est souvent limité en local, et essentiellement en PHP.

    Delphi peut cependant invoquer en HTTP un script PHP qui effectuera la requête.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Si il y a un accès TCP\IP sur les deux bases, deux connections sont possibles
    Pour MySQL regarde les possibilièts d'un Tunneling SSH fourni par Putty par exemple
    Pn peut très bien connecté deux bases de données effectivement pas de SQL entre les deux mais des opérations via le TDataSet !

    Il y a la méthode, où l'on recopierait un DataSet dans un autre, via une boucle sur EOF\Next, une seconde sur Fields et Value pour l'affectation si la structure est identique !

    MySQL gère très bien l'import de fichier CSV !
    Si tu peux faire un export de ce type en SQL Server (via UNLOAD par exemple), tu aurais un minimum de code à faire !

    tu peux aussi faire un petit programme qui génère du SQL pour MySQL en lisant la DB MSSQL, j'ai fait cela pour un export Paradox vers Oracle

    Pense qu'il existe des logiciels comme DataPump ... achetez un tel logiciel sera nettement moins cher que plusieurs journées de développement !
    En fait, ça coute à peine une demi-journée ! Cela vaut vraiment le coût

    Il existe TALEND aussi pour ce genre de manip

  4. #4
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Merci de vos réponses rapides!

    Alors j'ai réussi via odbc à me connecter à ma base en local, cependant si j'essaye de me connecter à ma base distante, j'obtiens une erreur de connexion.

    Par contre je n'ai pas compris cette phrase :
    Citation Envoyé par ShaiLeTroll Voir le message
    Si il y a un accès TCP\IP sur les deux bases, deux connections sont possibles
    Pour MySQL regarde les possibilités d'un Tunneling SSH fourni par Putty par exemple
    Pn peut très bien connecté deux bases de données effectivement pas de SQL entre les deux mais des opérations via le TDataSet !
    Peut être que je devrais plus me renseigner sur ce "tunneling SSH"?

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    et quelle est l'erreur ?

    erreur de connexion ? dans ce cas le serveur n'est probablement pas accessible

    erreur d'authentification ? les profils MySQL sont associés à un Host, local ou pas.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Citation Envoyé par Emyleen Voir le message
    Peut être que je devrais plus me renseigner sur ce "tunneling SSH"?
    C'est à ton hébergeur qu'il faut s'adresser, savoir ce qu'il peut mettre en place sur le Serveur contenant MySQL, ajouter un OpenSSH par exemple, sur le même ordi, ou même sur un frontal séparé avec PortForwarding + FireWall évidemment !
    Le Tunnelling SSH te permettra de simuler un "réseau local virtuel", ton programme pensera se connecter en local sur MySQL, mais tout sera redirigé vers le Server SSH qui lui redirigera sur MySQL.
    Cela permet à MySQL de conserver un accès Localhost strict ou un accès d'une IP locale (le Server SSH)

    Je parle d'hébergement professionnel évidemment, pas d'un truc gratos chez Free, SFR ou Orange par ce qu'ils sont ton FAI !

    Si tu n'as pas la possibilité d'avoir du SSH, un WebService en PHP déployé sur le Serveur MySQL permettrait l'écriture dans la DB (avec mot de passe aussi, en HTTPS évidemment)

  7. #7
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Je vous ai mis en pieces jointes l'image de l'erreur que j'obtiens, j'utilise une demo trouvée sur le net :

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    unit UDemo;
    {
     Copyright (C) 2009 Samuel Soldat <samuel.soldat@audio-data.de>
     
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
     
     This program is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
     more details.
     
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    }
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, StdCtrls, ExtCtrls, ComCtrls, mysql;
     
    type
      TForm1 = class(TForm)
        HostEdit: TEdit;
        Bevel1: TBevel;
        Label1: TLabel;
        Label2: TLabel;
        UserEdit: TEdit;
        Label3: TLabel;
        PasswordEdit: TEdit;
        LoginButton: TButton;
        DatabaseListBox: TListBox;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        TableListBox: TListBox;
        TableGrid: TDrawGrid;
        Label7: TLabel;
        FieldListGrid: TStringGrid;
        StatusBar: TStatusBar;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure LoginButtonClick(Sender: TObject);
        procedure DatabaseListBoxClick(Sender: TObject);
        procedure TableListBoxClick(Sender: TObject);
        procedure TableGridDrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
      private
        LibHandle: PMYSQL;
        mySQL_Res: PMYSQL_RES;
      public
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    {$WARNINGS OFF}
     
    procedure ClearGrid(Grid: TStringGrid);
    var
      row, col: Integer;
    begin
      for row := 1 to Grid.RowCount - 1 do
        for col := 0 to Grid.ColCount - 1 do
          Grid.Cells[col, row] := '';
    end;
     
    procedure TForm1.DatabaseListBoxClick(Sender: TObject);
    var
      MyResult: Integer;
      MYSQL_ROW: PMYSQL_ROW;
    begin
      if mySQL_Res<>nil
      then
        mysql_free_result(mySQL_Res);
      mySQL_Res := nil;
      TableListBox.Items.Clear;
      ClearGrid(FieldListGrid);
      TableListBox.Enabled := False;
      with DatabaseListBox do
        MyResult := mysql_select_db(LibHandle, PAnsiChar(AnsiString(Items[ItemIndex])));
      if MyResult<>0
      then
        raise Exception.Create(mysql_error(LibHandle));
      //Get Tablenames
      mySQL_Res := mysql_list_tables(LibHandle, nil);
      if mySQL_Res=nil
      then
        raise Exception.Create(mysql_error(LibHandle));
      try
        repeat
          MYSQL_ROW := mysql_fetch_row(mySQL_Res);
          if MYSQL_ROW<>nil
          then begin
            TableListBox.Items.Add(MYSQL_ROW^[0]);
          end;
        until MYSQL_ROW=nil;
      finally
        mysql_free_result(mySQL_Res);
        mySQL_Res := nil;
      end;
      if TableListBox.Items.Count>0
      then begin
        TableListBox.Enabled := True;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    { for embeeded server use
      libmysql_fast_load('c:\MySql\bin\libmysqld.dll');
    }
      libmysql_fast_load(nil);
      StatusBar.Panels[0].Text := 'Client ' + mysql_get_client_info;
      FieldListGrid.Cells[0, 0] := 'Name';
      FieldListGrid.Cells[1, 0] := 'Type';
      FieldListGrid.Cells[2, 0] := 'Len';
      FieldListGrid.Cells[3, 0] := 'Flags';
      FieldListGrid.Cells[4, 0] := 'Default';
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if mySQL_Res<>nil
      then
        mysql_free_result(mySQL_Res);
      if libmysql_status=LIBMYSQL_READY
      then
        mysql_close(LibHandle);
      libmysql_free;
    end;
     
    procedure TForm1.LoginButtonClick(Sender: TObject);
    var
      MYSQL_ROW: PMYSQL_ROW;
    begin
      if mySQL_Res<>nil
      then
        mysql_free_result(mySQL_Res);
      mySQL_Res := nil;
      DatabaseListBox.Items.Clear;
      DatabaseListBox.Enabled := False;
      if LibHandle<>nil
      then begin
        mysql_close(LibHandle);
        LibHandle := nil;
      end;
    {
    Examble for embeeded server init (only needed in special cases)
    const
      DefaultFile: array [0..1] of PAnsiChar=('', '--defaults-file=c:\windows\my.ini');
     ...
      if mysql_server_init(2, @DefaultFile, nil)<>0
      then
        raise Exception.Create('Embedded Server Init Failed');
    }
      LibHandle := mysql_init(nil);
      if LibHandle=nil
      then
        raise Exception.Create('mysql_init failed');
      if (mysql_real_connect(LibHandle,
                             PAnsiChar(AnsiString(HostEdit.Text)),
                             PAnsiChar(AnsiString(UserEdit.Text)),
                             PAnsiChar(AnsiString(PasswordEdit.Text)),
                             nil, 0, nil, 0)=nil)
      then
        raise Exception.Create(mysql_error(LibHandle));
      Caption := HostEdit.Text + ' '  + mysql_get_server_info(LibHandle);
      StatusBar.Panels[1].Text := mysql_character_set_name(LibHandle);
      //Get Databasenames
      mySQL_Res := mysql_list_dbs(LibHandle, nil);
      if mySQL_Res=nil
      then
        raise Exception.Create(mysql_error(LibHandle));
      try
        repeat
          MYSQL_ROW := mysql_fetch_row(mySQL_Res);
          if MYSQL_ROW<>nil
          then begin
            DatabaseListBox.Items.Add(MYSQL_ROW^[0]);
          end;
        until MYSQL_ROW=nil;
      finally
        mysql_free_result(mySQL_Res);
        mySQL_Res := nil;
      end;
      if DatabaseListBox.Items.Count>0
      then begin
        DatabaseListBox.Enabled := True;
      end;
    end;
     
    function GetFieldTypeString(mySQL_Field: PMYSQL_FIELD): String;
    const
      FieldtypeString1: array [MYSQL_TYPE_DECIMAL..MYSQL_TYPE_BIT] of String=(
       'NUMERIC', 'TINYINT', 'SMALLINT', 'INTEGER',
       'FLOAT', 'DOUBLE', 'T_NULL', 'TIMESTAMP',
       'BIGINT', 'MEDIUMINT', 'DATE', 'TIME',
       'DATETIME', 'YEAR', 'NEWDATE', 'VARCHAR',
       'BIT');
      FieldtypeString2: array [MYSQL_TYPE_NEWDECIMAL..MYSQL_TYPE_GEOMETRY] of String=(
        'NEWDECIMAL', 'ENUM', 'SET',
        'TINY_BLOB', 'MEDIUM_BLOB', 'LONG_BLOB', 'BLOB',
        'VAR_STRING', 'STRING', 'GEOMETRY');
    begin
      if mysql_field_type(mySQL_Field) in [MYSQL_TYPE_DECIMAL..MYSQL_TYPE_BIT]
      then
        Result := FieldtypeString1[mysql_field_type(mySQL_Field)]
      else
      if mysql_field_type(mySQL_Field) in [MYSQL_TYPE_NEWDECIMAL..MYSQL_TYPE_GEOMETRY]
      then
        Result := FieldtypeString2[mysql_field_type(mySQL_Field)]
      else
        Result := 'unknown';
    end;
     
    function GetFieldFlagString1(flag: longword): String;
    begin
    //  UpdateField(mySQL_Field);
      Result := '';
      if IS_NUM_FLAG(flag)
      then begin
        if (flag and UNSIGNED_FLAG) <> 0
        then
          Result := ' UNSIGNED';
        if (flag and AUTO_INCREMENT_FLAG) <> 0
        then
          Result := Result + ' INC';
      end
      else begin
        if (flag and ENUM_FLAG)<>0
        then
          Result := ' ENUM'
        else
        if (flag and SET_FLAG)<>0
        then
          Result := ' SET'
        else
        if (flag and BLOB_FLAG)<>0
        then
          Result := ' BLOB';
      end;
      if IS_NOT_NULL(flag)
      then
        Result := Result + ' NOT NULL';
      if IS_PRI_KEY(flag)
      then
        Result := Result + ' PRI_KEY';
      if flag and MULTIPLE_KEY_FLAG<>0
      then
        Result := Result + ' KEY';
    end;
     
    function GetFieldFlagString(Flags: longword): String;
      procedure Append(var s: String; const FlagStr: String);
      begin
        if s=''
        then
          s := FlagStr
        else
          s := s + ',' + FlagStr;
      end;
    begin
      Result := '';
      if IS_NUM_FLAG(Flags)
      then begin
        Append(Result, 'NUM');
        if (Flags and UNSIGNED_FLAG) <> 0
        then
          Append(Result, 'UNSIGNED');
        if (Flags and AUTO_INCREMENT_FLAG) <> 0
        then
          Append(Result, 'AUTO_INCREMENT');
      end
      else begin
        if (Flags and ENUM_FLAG)<>0
        then
          Append(Result, 'ENUM');
        if (Flags and SET_FLAG)<>0
        then
          Append(Result, 'SET');
        if (Flags and BLOB_FLAG)<>0
        then
          Append(Result, 'BLOB');
      end;
      if (Flags and NOT_NULL_FLAG)<>0
      then
        Append(Result, 'NOT_NULL');
      if (Flags and PRI_KEY_FLAG)<>0
      then
        Append(Result, 'PRI_KEY');
      if (Flags and UNIQUE_KEY_FLAG)<>0
      then
        Append(Result, 'UNIQUE_KEY');
      if (Flags and MULTIPLE_KEY_FLAG)<>0
      then
        Append(Result, 'MULTIPLE_KEY');
      if (Flags and ZEROFILL_FLAG)<>0
      then
        Append(Result, 'ZEROFILL');
      if (Flags and BINARY_FLAG)<>0
      then
        Append(Result, 'BINARY');
      if (Flags and NO_DEFAULT_VALUE_FLAG)<>0
      then
        Append(Result, 'NO_DEFAULT_VALUE');
      if (Flags and TIMESTAMP_FLAG)<>0
      then
        Append(Result, 'TIMESTAMP');
    end;
     
    procedure TForm1.TableListBoxClick(Sender: TObject);
    var
      i, field_count, row_count: Integer;
      mySQL_Field: PMYSQL_FIELD;
      sql: AnsiString;
      tablename: String;
      ticks: Cardinal;
    begin
      ClearGrid(FieldListGrid);
      Statusbar.Panels[2].Text := '';
      with TableListBox do
        tablename := Items[ItemIndex];
      if mySQL_Res<>nil
      then
        mysql_free_result(mySQL_Res);
      mySQL_Res := mysql_list_fields(LibHandle,  PAnsiChar(AnsiString(tablename)), nil);
      if mySQL_Res<>nil
      then begin
        //Get Fieldnames
        field_count := mysql_num_fields(mySQL_Res);
        FieldListGrid.RowCount := field_count+1;
        TableGrid.ColCount := field_count;
        for i := 0 to field_count - 1 do
        begin
          mySQL_Field := mysql_fetch_field(mySQL_Res);
          if mySQL_Field<>nil
          then begin
            FieldListGrid.Cells[0, i+1] := mysql_field_name(mySQL_Field);
            FieldListGrid.Cells[1, i+1] := GetFieldTypeString(mySQL_Field);
            FieldListGrid.Cells[2, i+1] := IntToStr(mysql_field_length(mySQL_Field));
            FieldListGrid.Cells[3, i+1] := GetFieldFlagString(mysql_field_flag(mySQL_Field));
            FieldListGrid.Cells[4, i+1] := mysql_field_default(mySQL_Field)
          end;
        end;
        mysql_free_result(mySQL_Res);
        mySQL_Res := nil;
      end;
      sql := 'select * from ' + QuoteName(tablename);
      ticks := GetTickCount;
      if mysql_real_query(LibHandle, PAnsiChar(sql), Length(sql))<>0
      then
        raise Exception.Create(mysql_error(LibHandle));
      //Get Data
      mySQL_Res := mysql_store_result(LibHandle);
      if mySQL_Res<>nil
      then begin
        row_count := mysql_num_rows(mySQL_Res);
        Statusbar.Panels[2].Text := Format('Rowcount: %d - Time: %d ms', [row_count, (GetTickCount-ticks)]);
        if row_count>0
        then begin
          TableGrid.RowCount := row_count + 1;
        end
        else begin
          TableGrid.RowCount := 2;
        end;
      end;
    end;
     
    procedure TForm1.TableGridDrawCell(Sender: TObject; ACol, ARow: Integer;
                                       Rect: TRect; State: TGridDrawState);
    var
      MYSQL_ROW: PMYSQL_ROW;
      mySQL_Field: PMYSQL_FIELD;
    begin
      if mySQL_Res<>nil
      then begin
        if (ARow=0)
        then begin
          mySQL_Field := mysql_fetch_field_direct(mySQL_Res, ACol);
          if mySQL_Field<>nil
          then begin
            TableGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, mysql_field_name(mySQL_Field));
          end;
        end
        else
        if (ARow>0) and (ARow<=mysql_num_rows(mySQL_Res))
        then begin
          mysql_data_seek(mySQL_Res, ARow-1);
          MYSQL_ROW := mysql_fetch_row(mySQL_Res);
          if MYSQL_ROW<>nil
          then begin
            TableGrid.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, MYSQL_ROW^[ACol]);
          end;
        end;
      end;
    end;
     
    end.

    Merci ShaiLeTroll pour l'explication, le serveur auquel je veux accéder est chez OVH, je vais voir si le SSH est disponible et me renseigner pour l'utiliser
    Images attachées Images attachées  

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Oui c'est une erreur Winsock WSAECONNREFUSED, connexion refusée.

    les solutions vont dépendre de ton offre OVH hébergement mutualisé ou serveur dédié. Sur le serveur dédié tu peux configurer MySQL pour accepter une connexion externe...mais le plus reste à mon avis le script PHP d'importation.

    Soit tu déposes les données en FTP sur le site puis tu invoques le script pour qu'il traite le fichier.

    Soit tu envoie directement les données en HTTP au script PHP.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Tu utilises LibMySQL.dll directement !
    C'est un peu plus pénible que via ADO, il faut tout gérer à la main !

    Il me semble que si l'erreur vient MySQL car l'IP de ton client n'est pas dans les host autorisés celle-ci est un peu plus verbeuse genre

    Error: 1130 SQLSTATE: HY000 (ER_HOST_NOT_PRIVILEGED)
    Message: Host '%s' is not allowed to connect to this MySQL server
    je pense l'IP que tu indiques n'est pas celle du Server MySQL mais d'un Frontal Web, le port n'est pas ouvert donc pas de connexion !

    Est-ce qu'un Firewall qui empêche l'accès au Serveur, possible mais il me semblait que l'erreur était différente (ça doit dépendre du type de Firewall)

    Le WebService en PHP ou un simple script peuvent être une solution si OVH ne propose pas (à un prix raisonnable) des accès sécurisés par l'extérieur !
    Attention au volume de données envoyés une seule passe (via HTTP), c'est limité par le serveur !

    Une solution par SFTP plus un WS comme déclencheur est une bonne idée effectivement, là où je travaillais avant c'est 95% des flux qui fonctionnait sur ce principe, aspiration à la demande ou sur crontask, tous les échanges étaient en CSV (norme française) entre une vingtaine de serveurs MySQL 4.1 (EasyPHP 1.8) sur des Windows répartis sur l'ensemble de la France
    Idem pour d'autres modules ou projets, envoie d'un CSV en SFTP depuis un MySQL4.1 sur Windows vers du MySQL 5.x sur Fedora !

    Sinon, j'ai déjà migré en DB SQL Server en MySQL en 2010, via les outils fourni par MySQL : MySQL Migration Toolkit, cela gère étape par étape la création de la base (on peut ajouter et modifier des élements), à la fin cela génère un script que l'on peut relancer à volonté !
    Faut juste pouvoir accéder aux deux bases en TCP\IP !
    Cela fonctionne très bien !

  10. #10
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    je pense l'IP que tu indiques n'est pas celle du Server MySQL mais d'un Frontal Web, le port n'est pas ouvert donc pas de connexion !
    Oui c''est possible, je suis en train de chercher la bonne adresse pour pouvoir y accéder, j'ai essayé avec l'adresse FTP mais ça n'est pas ça.

    Citation Envoyé par Paul TOTH Voir le message
    Delphi peut cependant invoquer en HTTP un script PHP qui effectuera la requête.
    Citation Envoyé par ShaiLeTroll Voir le message
    Le WebService en PHP ou un simple script peuvent être une solution si OVH ne propose pas (à un prix raisonnable) des accès sécurisés par l'extérieur !
    Attention au volume de données envoyés une seule passe (via HTTP), c'est limité par le serveur !
    Je viens d'aller sur mon manager OVH et je n'ai rien vu concernant un accès sécurisé à ma base de données.... Mais je dois dire que je ne trouve pas l'interface très intuitive.
    Pour la limite d'envoi, aurais-tu un ordre d'idée? Un nombre d'octet?

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, j'ai déjà migré en DB SQL Server en MySQL en 2010, via les outils fourni par MySQL : MySQL Migration Toolkit, cela gère étape par étape la création de la base (on peut ajouter et modifier des élements), à la fin cela génère un script que l'on peut relancer à volonté !
    Faut juste pouvoir accéder aux deux bases en TCP\IP !
    Cela fonctionne très bien !
    Malheureusement ça n'est pas ce dont j'ai besoin, la base d'arrivée est déjà créé et ne doit récupérer que certaines des données de la base de départ. D'ailleurs pour l'instant mon script n'agirait que sur une seule table que je mettrais à jour à l'aide de certaines données prises sur plusieurs tables de la base de départ.

    Il faut savoir qu'au final ce sera un script de mise à jour interprété automatiquement à la fin de chaque journée par exemple.

    Je peux déjà me connecter sur ma base MySQL en local, je vais faire mes premiers tests de mise à jour en local et je chercherais ensuite à me connecter en distant, car j'ai essayé toutes les adresses que j'avais pour me connecter à ma BD distante mais aucune n'a l'air de fonctionner.

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Tu peux trouver l'adresse de ton serveur MySQL dans "Hébergement" / "Gestion SQL", mais tu ne pourras pas y accéder de ton poste.

    La limite d'envoie est donnée par PHPInfo() sur ma page OVH post_max_size est fixée à 64M...pas mal

    mais à ta place je passerais par un upload FTP, c'est plus facile à gérer, et ensuite le script PHP pourra tranquillement le traiter quelque soit sa taille (avec des fgets())...attention au set_time_limit() tout de même si tu as bcp de données.

  12. #12
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    A ta place je passerais par un upload FTP, c'est plus facile à gérer, et ensuite le script PHP pourra tranquillement le traiter quelque soit sa taille (avec des fgets())...attention au set_time_limit() tout de même si tu as bcp de données.
    En fait d'après ce que je comprends, ce serait plus simple d'envoyer mon script dans un fichier via FTP puis de l'exécuter via mon site web? Parce que ça ne m'arrange pas ça, il faudrait que je me connecte à mon site web à chaque fois que je lancerais la mise à jour de la BD, autrement dit à chaque fois que j'enverrais mon fichier de script par FTP?

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Ah ! Ce n'est pas une migration mais un transfert de données + consolidation !

    Talend fait cela très bien ! Cela génère un script Java réutilisable !

    Avec ton Serveur MySQL, tu as un serveur Apache + PHP ?

    Pour la limite, on avait un système d'export en Delphi qui générait un fichier CSV
    Avant on utiliser LOAD DATA INFILE de MySQL pour importer des CSV (envoyé par SFTP) mais un jour, ma chef a pondu un délire !
    C'était la mode du WebService au bureau, il voulait arrêter l'utilisation de SFTP et moi j'aime les délires, ça change des trucs trop simple, l'innovation c'est toujours plus rigolo même si ça sert à rien
    La partie Import en PHP était une Uzinagaz lourdissime (ça devait passer le CSV en XML puis avec un XSD et tout ce genre de truc)
    On a du augmenté les limites de tout !
    Pour Apache, fallait augmenté la taille et temps maximal d'une requête HTTP(S), ainsi qu'augmenté la taille du processus PHP (passé de 32 à 128Mo)
    Ainsi que pour MySQL modifier la taille maximal des BLOBS ...
    On faisait tout exploser !
    Ce n'était pourtant qu'un petit export rien à avoir avec un autre module pouvant générer plusieurs Go de Fichier en une seule nuit !
    Malgré la volonté d'un responsable d'arrêter le SFTP, ils n'ont rien trouvé de mieux pour un tel volume !

    On avait aussi la valeur de retour, parfois l'importateur générait des millions de ligne d'erreur (tout un système de contrôle de validité de donnée d'un organisme française de veille sanitaire .... , ça faisait exploser le SOAP, ce coup-ci, on a du côté logiciel ajouté un paramètre pour plafonner le nombre d'erreur !

    Je t'avoue que j'ai fait cela il y a presque 2 ans (j'ai changé de société entre-temps), je ne me souviens pas de tout, surtout que je n'étais pas le développeur PHP, Linux, Apache et tout ça, ça n'est pas mon truc mais comme le développeur était un bulot (surtout un gros manque de communication et de réactivité), j'ai trouvé dû trouver les solutions par moi-même !


    @Paul Toth, 64Mo, ouais, pas mal, je crois que l'on était plafonné à 8Mo (sur une installation locale, peut-être la valeur par défaut d'Apache ???)
    Pas bol, un jour, lors d'un export d'une grosse base, c'est monté à 9Mo !
    Je crois que dans le premier jet, on envoyait le fichier directement, j'ai ajouté un zip level 9 du fichier puis un encodage en base64, même si dernier multipliait par 4 le zip faisait gagner 90% donc c'était mieux !
    D'ailleurs, le zip contenait CSV + Fichier Excel !

    Citation Envoyé par Emyleen Voir le message
    En fait d'après ce que je comprends, ce serait plus simple d'envoyer mon script dans un fichier via FTP puis de l'exécuter via mon site web? Parce que ça ne m'arrange pas ça, il faudrait que je me connecte à mon site web à chaque fois que je lancerais la mise à jour de la BD, autrement dit à chaque fois que j'enverrais mon fichier de script par FTP?
    utilise une CronTask !
    Dans nos projets, un shell sur fedora détectait les nouveaux fichiers et lançaient automatiquement l'import !
    Bon encore une fois, si tu n'as pas une maîtrise du serveur pour y installer des script, c'est mort !

    Pense qu'avec le FTP, tu as des Remote Command !
    Il y a presque 10 ans avec le TNMFTP de Delphi 6, j'utilisais DoCommand pour lancer un script AS400 (le serveur FTP étant un AS400), j'ignore les équivalents avec les composants Indy mais ça bien exister !

    Dans ton programme, un TIdFTP pour l'envoie, puis un TIdHTTP pour l'appel, rien de bien compliquer, c'est une procédure tout à fait automatisable !

  14. #14
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    Je viens de regarder dans mon manager OVH, mais apparemment la BD distante sur laquelle je travaille n'est pas celle qui est reliée à l'hébergement de mon domaine
    Pourtant moi je m'y connecte facilement via phpMyAdmin sur une adresse commençant par http://sqlprive.ovh.net.
    J'ai rajouté une Base de données sur l'hébergement de mon domaine, pour voir si je peux y accéder via mon script Delphi.

    Citation Envoyé par ShaiLeTroll Voir le message
    Ah ! Ce n'est pas une migration mais un transfert de données + consolidation !

    Talend fait cela très bien ! Cela génère un script Java réutilisable !
    Oui mais moi j'ai que du code en Delphi et du code en PHP/SQL :s

    Citation Envoyé par ShaiLeTroll Voir le message
    Avec ton Serveur MySQL, tu as un serveur Apache + PHP ?
    Je penses que c'est ça oui

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par Emyleen Voir le message
    En fait d'après ce que je comprends, ce serait plus simple d'envoyer mon script dans un fichier via FTP puis de l'exécuter via mon site web? Parce que ça ne m'arrange pas ça, il faudrait que je me connecte à mon site web à chaque fois que je lancerais la mise à jour de la BD, autrement dit à chaque fois que j'enverrais mon fichier de script par FTP?
    ?!

    bon on reprend

    tu as un serveur SQLServer avec des données que tu veux placer sur dans une base MySQL d'un site hébergé par OVH.

    tu as un projet Delphi qui sait lire les données, et tu aurais voulu te connecter sur le serveur MySQL chez OVH, sauf que ça c'est pas possible.

    Par contre tu peux générer un fichier dans un format de ton choix qu'un script PHP de ta conception sera capable de lire pour intégrer son contenu dans la base MySQL à laquelle il a accès.

    Il ne restera à ton application Delphi qu'à faire 3 choses
    1- lire les données SQLServeur pour générer le fichier de données
    2- placer ce fichier sur le serveur web via un transfert FTP
    3- invoquer (toujours depuis Delphi) une URL spécifique sur ton site
    http://www.monsite.com/importSQL.php
    avec éventuellement un mot de passe, qui se chargera de traiter le fichier qui vient d'être déposé sur le serveur.

    évidemment il aura fallut placer le script importSQL.php préalablement sur le serveur

    En plus cours tu pourrais aussi avoir un script PHP qui te permette d'executer une requête SQL...mais là t'a fortement intérêt de blinder l'accès au script
    remarque c'est ce que fait phpMyAdmin...tient ça pourrait être intéressant de faire un composant Delphi pour piloter phpMyAdmin ^^

  16. #16
    Membre actif
    Avatar de Emyleen
    Femme Profil pro
    Webmaster
    Inscrit en
    Mars 2010
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 150
    Points : 230
    Points
    230
    Par défaut
    XD Merci Paul TOTH!

    Désolé d'être longue à comprendre X)

    Je vais faire ce que tu me conseilles, je met le sujet en résolu et je reviendrais me plaindre si j'ai pas réussi à faire fonctionner tout ça

    En tout cas encore merci à toi et a ShaiLeTroll d'avoir prit du temps pour moi

    Bonne soirée ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transfert entre une base SQLserver et une base MySQL
    Par Emyleen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/12/2011, 09h09
  2. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo