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 :

Delphi7 et TMySqlComponent


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut Delphi7 et TMySqlComponent
    Salut,
    Je suis un débutant en Dephi et j'utilise MySQL 5, comment acceder à ma base de donner, j'ai utiliser le composant TMySqlComponent que je nommais MySQL, voici ma code :

    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
    MySQL.Host:='localhost';
    MySQL.Login:='roott';
    MySQL.Password:='root';
    MySQL.Database:='parc_automobile';
    if MySQL.Connect=true then
    begin
    showmessage('Connexion au server etablie');
    end
    else
    begin
    showmessage('Connexion non etablie');
    end;
     
    end;

    Et lors de l'execution, l'application affiche :
    " Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000.

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Petite Remarque sur la syntaxe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MySQL.Connect=true then
    tu peux, voir tu dois l'écrire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MySQL.Connect() then
    c'est un booleen donc il se teste naturellement sur un if c'est fait pour, et les () ce n'est pas obligatoire mais cela aide à comprendre que c'est une fonction

    en fin, MySQL doit être nil, l'as tu posé sur une Form ? as tu créé la Form ? ou voulais tu faire une instanciation dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySQL := TMySqlComponent.Create(Self); // Self ou nil ...
    Pense au balise [CODE] et [/ CODE]
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut
    OUi j'ai créer une formulaire que j'ai nommé Form1
    J'ai placer le composant TMySQLComponent que j'ai nommé MySQL
    Comme tu disais dans l'initialisation de mysql.pas, j'ecris :

    libmysql_load(nil);

    puis : libmysql_free;

    c'est dans le code en bas que l'erreur c'est produit:

    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
    function TMySQLComponent.Connect : integer;
    begin
         if (not Connected) or (not Selected) then
         begin
              Linkp   := mysql_init(nil);
     {ici l'erreur}         if (mysql_connect(Linkp, PChar(Hostp), PChar(Loginp), PChar(Passwordp)) = nil) then
              begin
                   Connected := false;
                   Connect := -1;
                   exit;
              end
              else
              begin
                   Connected := true;
                   if (mysql_select_db(Linkp, PChar(Databasep))<>0) then
                   begin
                        Selected := false;
                        Connect := -2;
                        exit;
                   end;
                   Selected := true;
              end;
         end;
         Connect := 0;
    end;

    ou le mieux c'est que je te donne les deux unités du composants ?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    ajoute les deux unités sur le forum, ayant déjà mysql.pas (3.23.49, un peu vieille ma libmySQL.dll), cela m'interesse, d'avoir une lib pour MySQL 5, n'ayant testé qu'avec la version 4.1. Tes unités necessité une installation ?

    Au bureau, je suis sous MyDAC de CoreLab, ... mais j'ai aussi tenté les unités qui utilise en direct la DLL mySQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySQL := TMySqlComponent.Create(nil)
    et

    cela n'a aucun rapport, le 1er étant l'instanciation d'un objet, et l'autre étant le chargement de la DLL


    Sinon, moi, mon code (en remplacement du TMySQLComponent), je t'invite a étudier mysql_options et mysql_real_connect.

    Code : 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
    procedure TepcMySQLConnexionPassThrough.Connect();
    begin
      if not FConnected then
      begin
         try
            FConnexion := mysql_init(nil);
         except
            {$IFDEF DATA_MySQL_PassThrough}
            raise EMyError.Create(0, 'Librarie MySQL non Installée !');
            {$ELSE}
            Exit;
            {$ENDIF}
         end;
     
         if not Assigned(FConnexion) then
         begin
            raise EMyError.CreateFmt('Connexion non Initialisée : %d - %s ', [mysql_errno(FConnexion), mysql_error(FConnexion)]);
         end;
     
         if mysql_options(FConnexion, MYSQL_OPT_CONNECT_TIMEOUT, PChar(FTimeOut)) <> 0 then
         begin
            raise EMyError.CreateFmt('TimeOut non Initialisé  : %d - %s ', [mysql_errno(FConnexion), mysql_error(FConnexion)]);
         end;
     
         if not Assigned(mysql_real_connect(FConnexion, PChar(FServerName), PChar(FLogin), PChar(FPW), PChar(FDataBaseName), 0, nil, 0)) then
         begin
            raise EMyError.CreateFmt('Echec de la Connexion : %d - %s ', [mysql_errno(FConnexion), mysql_error(FConnexion)]);
         end;
      end;
     
      FConnected := True;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut Delphi7 et TMySqlComponent
    bonjours,

    Dans l'inspecteur d'Objets[Propriétés]

    Database = test
    Host = localhost
    INIFileName = MySqlComponent.ini
    Login = root
    Name = Sql
    Password = [vide]
    Tag = 0

    Maintenant je n'est qu'une unité je te le passe :

    unit MysqlComponent;

    interface

    uses
    SysUtils, Classes, Windows, Winsock, INIFiles, ComObj, Variants,
    StdCtrls // pour TListbox
    ;

    // ----------------
    // From myEspiritu.h ...
    // ----------------

    const {Attention confusion entre Blob et Text dû a la librairie mysql}
    STRING_FIELD_TYPE_DECIMAL = 'Chiffre décimal';
    STRING_FIELD_TYPE_TINY = 'Chiffre Entier (tout petit)';
    STRING_FIELD_TYPE_SHORT = 'Chiffre Entier (petit)';
    STRING_FIELD_TYPE_LONG = 'Chiffre Entier (grand)';
    STRING_FIELD_TYPE_FLOAT = 'Chiffre réel';
    STRING_FIELD_TYPE_DOUBLE = 'Chiffre double';
    STRING_FIELD_TYPE_NULL = 'Nulle';
    STRING_FIELD_TYPE_TIMESTAMP = 'Tampon de Temps';
    STRING_FIELD_TYPE_LONGLONG = 'Chiffre Entier (trés grand)';
    STRING_FIELD_TYPE_INT24 = 'Chiffre Eniter sur 24 bits';
    STRING_FIELD_TYPE_DATE = 'Date';
    STRING_FIELD_TYPE_TIME = 'Heure minute seconde';
    STRING_FIELD_TYPE_DATETIME = 'Date et H.M.S.';
    STRING_FIELD_TYPE_YEAR = 'Année';
    STRING_FIELD_TYPE_NEWDATE = 'Nouvelle date';
    STRING_FIELD_TYPE_ENUM = 'Enum';
    STRING_FIELD_TYPE_SET = 'Set';
    STRING_FIELD_TYPE_TINY_BLOB = 'Blob (petit)';
    STRING_FIELD_TYPE_MEDIUM_BLOB = 'Blob (moyen)';
    STRING_FIELD_TYPE_LONG_BLOB = 'Blob (grand)';
    STRING_FIELD_TYPE_BLOB = 'Texte';
    STRING_FIELD_TYPE_VAR_STRING = 'Texte variable';
    STRING_FIELD_TYPE_STRING = 'Texte';

    STRING1_FIELD_TYPE_DECIMAL = 'DECIMAL';
    STRING1_FIELD_TYPE_TINY = 'TINYINT';
    STRING1_FIELD_TYPE_SHORT = 'SHORTINT';
    STRING1_FIELD_TYPE_LONG = 'INT'; //INT(11)
    STRING1_FIELD_TYPE_FLOAT = 'FLOAT';
    STRING1_FIELD_TYPE_DOUBLE = 'DOUBLE';
    STRING1_FIELD_TYPE_NULL = 'NULL';
    STRING1_FIELD_TYPE_TIMESTAMP = 'TIMESTAMP';
    STRING1_FIELD_TYPE_LONGLONG = 'BIGINT'; //BIGINT(20)
    STRING1_FIELD_TYPE_INT24 = 'BIGINT';
    STRING1_FIELD_TYPE_DATE = 'DATE';
    STRING1_FIELD_TYPE_TIME = 'TIME';
    STRING1_FIELD_TYPE_DATETIME = 'DATETIME';
    STRING1_FIELD_TYPE_YEAR = 'YEAR';
    STRING1_FIELD_TYPE_NEWDATE = 'NEWDATE';
    STRING1_FIELD_TYPE_ENUM = 'ENUM';
    STRING1_FIELD_TYPE_SET = 'SET';
    STRING1_FIELD_TYPE_TINY_BLOB = 'BLOB';
    STRING1_FIELD_TYPE_MEDIUM_BLOB = 'MEDIUMBLOB';
    STRING1_FIELD_TYPE_LONG_BLOB = 'LONGBLOB';
    STRING1_FIELD_TYPE_BLOB = 'BLOB';
    STRING1_FIELD_TYPE_VAR_STRING = 'VARCHAR';
    STRING1_FIELD_TYPE_STRING = 'TEXT';

    FIELD_TYPE_TINYTEXT = 255;
    STRING1_FIELD_TYPE_TINYTEXT = 'TINYTEXT';
    FIELD_TYPE_TEXT = 256;
    STRING1_FIELD_TYPE_TEXT = 'TEXT';
    FIELD_TYPE_MEDIUMTEXT = 257;
    STRING1_FIELD_TYPE_MEDIUMTEXT = 'MEDIUMTEXT';
    FIELD_TYPE_LONGTEXT = 258;
    STRING1_FIELD_TYPE_LONGTEXT = 'LONGTEXT';

    // ----------------
    // From mysql.h ...
    // ----------------

    type
    my_bool = byte;
    gptr = pChar;

    type
    PUSED_MEM = ^TUSED_MEM; // struct for once_alloc
    TUSED_MEM = record
    next: PUSED_MEM; // Next block in use
    left: longword; // memory left in block
    size: longword; // size of block
    end;

    type
    error_proc = procedure;

    type
    PMEM_ROOT = ^TMEM_ROOT;
    TMEM_ROOT = record
    free: PUSED_MEM;
    used: PUSED_MEM;
    pre_alloc: PUSED_MEM;
    min_malloc: longword;
    block_size: longword;
    error_handler: error_proc;
    end;

    type
    my_socket = TSocket;

    // --------------------
    // From mysql_com.h ...
    // --------------------

    const
    NAME_LEN = 64; // Field/table name length
    HOSTNAME_LENGTH = 60;
    USERNAME_LENGTH = 16;
    SERVER_VERSION_LENGTH = 60;

    LOCAL_HOST = 'localhost';
    LOCAL_HOST_NAMEDPIPE = '.';

    MYSQL_NAMEDPIPE = 'MySQL';
    MYSQL_SERVICENAME = 'MySql';

    type
    enum_server_command = (
    COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY,
    COM_FIELD_LIST, COM_CREATE_DB, COM_DROP_DB, COM_REFRESH,
    COM_SHUTDOWN, COM_STATISTICS,
    COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL,
    COM_DEBUG, COM_PING, COM_TIME, COM_DELAYED_INSERT,
    COM_CHANGE_USER, COM_BINLOG_DUMP,
    COM_TABLE_DUMP, COM_CONNECT_OUT
    );

    const
    NOT_NULL_FLAG = 1; // Field can't be NULL
    PRI_KEY_FLAG = 2; // Field is part of a primary key
    UNIQUE_KEY_FLAG = 4; // Field is part of a unique key
    MULTIPLE_KEY_FLAG = 8; // Field is part of a key
    BLOB_FLAG = 16; // Field is a blob
    UNSIGNED_FLAG = 32; // Field is unsigned
    ZEROFILL_FLAG = 64; // Field is zerofill
    BINARY_FLAG = 128;

    // The following are only sent to new clients

    ENUM_FLAG = 256; // field is an enum
    AUTO_INCREMENT_FLAG = 512; // field is a autoincrement field
    TIMESTAMP_FLAG = 1024; // Field is a timestamp
    SET_FLAG = 2048; // field is a set
    NUM_FLAG = 32768; // Field is num (for clients)
    PART_KEY_FLAG = 16384; // Intern; Part of some key
    GROUP_FLAG = 32768; // Intern: Group field
    UNIQUE_FLAG = 65536; // Intern: Used by sql_yacc

    REFRESH_GRANT = 1; // Refresh grant tables
    REFRESH_LOG = 2; // Start on new log file
    REFRESH_TABLES = 4; // close all tables
    REFRESH_HOSTS = 8; // Flush host cache
    REFRESH_STATUS = 16; // Flush status variables
    REFRESH_THREADS = 32; // Flush status variables
    REFRESH_SLAVE = 64; // Reset master info and restart slave
    // thread
    REFRESH_MASTER = 128; // Remove all bin logs in the index
    // and truncate the index

    // The following can't be set with mysql_refresh()

    REFRESH_READ_LOCK = 16384; // Lock tables for read
    REFRESH_FAST = 32768; // Intern flag

    CLIENT_LONG_PASSWORD = 1; // new more secure passwords
    CLIENT_FOUND_ROWS = 2; // Found instead of affected rows
    CLIENT_LONG_FLAG = 4; // Get all column flags
    CLIENT_CONNECT_WITH_DB = 8; // One can specify db on connect
    CLIENT_NO_SCHEMA = 16; // Don't allow database.table.column
    CLIENT_COMPRESS = 32; // Can use compression protcol
    CLIENT_ODBC = 64; // Odbc client
    CLIENT_LOCAL_FILES = 128; // Can use LOAD DATA LOCAL
    CLIENT_IGNORE_SPACE = 256; // Ignore spaces before '('
    CLIENT_INTERACTIVE = 1024; // This is an interactive client
    CLIENT_SSL = 2048; // Switch to SSL after handshake
    CLIENT_IGNORE_SIGPIPE = 4096; // IGNORE sigpipes
    CLIENT_TRANSACTIONS = 8192; // Client knows about transactions

    SERVER_STATUS_IN_TRANS = 1; // Transaction has started
    SERVER_STATUS_AUTOCOMMIT = 2; // Server in auto_commit mode

    MYSQL_ERRMSG_SIZE = 200;
    NET_READ_TIMEOUT = 30; // Timeout on read
    NET_WRITE_TIMEOUT = 60; // Timeout on write
    NET_WAIT_TIMEOUT = 8*60*60; // Wait for new query

    type
    PVio = ^TVio;
    TVio = record
    end;

    type
    PNET = ^TNET;
    TNET = record
    vio: PVio;
    fd: my_socket;
    fcntl: longint;
    buff, buff_end, write_pos, read_pos: pByte;
    last_error: array [0..MYSQL_ERRMSG_SIZE - 1] of char;
    last_errno, max_packet, timeout, pkt_nr: longword;
    error: byte;
    return_errno, compress: my_bool;
    no_send_ok: my_bool; // needed if we are doing several
    // queries in one command ( as in LOAD TABLE ... FROM MASTER ),
    // and do not want to confuse the client with OK at the wrong time
    remain_in_buf, length, buf_length, where_b: longword;
    return_status: pLongword;
    reading_or_writing: byte;
    save_char: char;
    end;

    const
    packet_error: longword = $ffffffff;

    const
    FIELD_TYPE_DECIMAL = 0;
    FIELD_TYPE_TINY = 1;
    FIELD_TYPE_SHORT = 2;
    FIELD_TYPE_LONG = 3;
    FIELD_TYPE_FLOAT = 4;
    FIELD_TYPE_DOUBLE = 5;
    FIELD_TYPE_NULL = 6;
    FIELD_TYPE_TIMESTAMP = 7;
    FIELD_TYPE_LONGLONG = 8;
    FIELD_TYPE_INT24 = 9;
    FIELD_TYPE_DATE = 10;
    FIELD_TYPE_TIME = 11;
    FIELD_TYPE_DATETIME = 12;
    FIELD_TYPE_YEAR = 13;
    FIELD_TYPE_NEWDATE = 14;
    FIELD_TYPE_ENUM = 247;
    FIELD_TYPE_SET = 248;
    FIELD_TYPE_TINY_BLOB = 249;
    FIELD_TYPE_MEDIUM_BLOB = 250;
    FIELD_TYPE_LONG_BLOB = 251;
    FIELD_TYPE_BLOB = 252;
    FIELD_TYPE_VAR_STRING = 253;
    FIELD_TYPE_STRING = 254;

    const
    FIELD_TYPE_CHAR = FIELD_TYPE_TINY; // For compability
    FIELD_TYPE_INTERVAL = FIELD_TYPE_ENUM; // For compability

    type
    enum_field_types = FIELD_TYPE_DECIMAL..FIELD_TYPE_STRING;

    // ------------------------
    // From mysql_version.h ...
    // ------------------------

    const
    PROTOCOL_VERSION = 10;
    MYSQL_SERVER_VERSION = '3.23.49';
    MYSQL_SERVER_SUFFIX = '';
    FRM_VER = 6;
    MYSQL_VERSION_ID = 32349;
    MYSQL_PORT = 3306;
    MYSQL_UNIX_ADDR = '/tmp/mysql.sock';

    // ----------------
    // From mysql.h ...
    // ----------------

    type
    PMYSQL_FIELD = ^TMYSQL_FIELD;
    TMYSQL_FIELD = record
    name: pChar; // Name of column
    table: pChar; // Table of column if column was a field
    def: pChar; // Default value (set by mysql_list_fields)
    _type: enum_field_types; // Type of field. Se mysql_com.h for types
    length: longword; // Width of column
    max_length: longword; // Max width of selected set
    flags: longword; // Div flags
    decimals: longword; // Number of decimals in field
    end;

    type
    PMYSQL_ROW = ^TMYSQL_ROW; // return data as array of strings
    TMYSQL_ROW = array[0..MaxInt div SizeOf(pChar) - 1] of pChar;

    type
    MYSQL_FIELD_OFFSET = longword; // offset to current field

    type
    my_ulonglong = int64;

    const
    MYSQL_COUNT_ERROR: my_ulonglong = not 0;

    type
    PMYSQL_ROWS = ^TMYSQL_ROWS;
    TMYSQL_ROWS = record
    next: PMYSQL_ROWS; // list of rows
    data: PMYSQL_ROW;
    end;

    type
    MYSQL_ROW_OFFSET = PMYSQL_ROWS; // offset to current row

    type
    PMYSQL_DATA = ^TMYSQL_DATA;
    TMYSQL_DATA = record
    rows: my_ulonglong;
    fields: longword;
    data: PMYSQL_ROWS;
    alloc: TMEM_ROOT;
    end;

    type
    PMYSQL_OPTIONS = ^TMYSQL_OPTIONS;
    TMYSQL_OPTIONS = record
    connect_timeout, client_flag: longword;
    compress, named_pipe: my_bool;
    port: longword;
    host, init_command, user, password, unix_socket, db: pChar;
    my_cnf_file, my_cnf_group, charset_dir, charset_name: pChar;
    use_ssl: my_bool; // if to use SSL or not
    ssl_key: pChar; // PEM key file
    ssl_cert: pChar; // PEM cert file
    ssl_ca: pChar; // PEM CA file
    ssl_capath: pChar; // PEM directory of CA-s?
    end;

    type
    mysql_option = (
    MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
    MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND,
    MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
    MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME,
    MYSQL_OPT_LOCAL_INFILE
    );

    type
    mysql_status = (
    MYSQL_STATUS_READY, MYSQL_STATUS_GET_RESULT,
    MYSQL_STATUS_USE_RESULT
    );

    type
    PMYSQL_FIELDS = ^TMYSQL_FIELDS;
    TMYSQL_FIELDS = array[0..MaxInt div SizeOf(TMYSQL_FIELD) - 1] of TMYSQL_FIELD;

    type
    PCHARSET_INFO = ^TCHARSET_INFO;
    TCHARSET_INFO = record
    // Omitted: Structure not necessarily needed.
    // Definition of struct charset_info_st can be
    // found in include/m_ctype.h
    end;

    type
    PMYSQL = ^TMYSQL;
    TMYSQL = record
    net: TNET; // Communication parameters
    connector_fd: gptr; // ConnectorFd for SSL
    host, user, passwd, unix_socket, server_version, host_info, info, db: pChar;
    port, client_flag, server_capabilities: longword;
    protocol_version: longword;
    field_count: longword;
    server_status: longword;
    thread_id: longword; // Id for connection in server
    affected_rows: my_ulonglong;
    insert_id: my_ulonglong; // id if insert on table with NEXTNR
    extra_info: my_ulonglong; // Used by mysqlshow
    packet_length: longword;
    status: mysql_status;
    fields: PMYSQL_FIELDS;
    field_alloc: TMEM_ROOT;
    free_me: my_bool; // If free in mysql_close
    reconnect: my_bool; // set to 1 if automatic reconnect
    options: TMYSQL_OPTIONS;
    scramble_buff: array [0..8] of char;
    charset: PCHARSET_INFO;
    server_language: longword;
    end;

    type
    PMYSQL_RES = ^TMYSQL_RES;
    TMYSQL_RES = record
    row_count: my_ulonglong;
    field_count, current_field: longword;
    fields: PMYSQL_FIELDS;
    data: PMYSQL_DATA;
    data_cursor: PMYSQL_ROWS;
    field_alloc: TMEM_ROOT;
    row: PMYSQL_ROW; // If unbuffered read
    current_row: PMYSQL_ROW; // buffer to current row
    lengths: pLongword; // column lengths of current row
    handle: PMYSQL; // for unbuffered reads
    eof: my_bool; // Used my mysql_fetch_row
    end;

    type
    PMYSQL_LENGTHS = ^TMYSQL_LENGTHS;
    TMYSQL_LENGTHS = array[0..MaxInt div SizeOf(longword) - 1] of longword;

    type
    extend_buffer_func = function(void: pointer; _to: pChar; length: pLongword): pChar;

    // Status codes for libmySQL.dll

    const
    LIBMYSQL_UNDEFINED = 0; // libmysql_load() has not yet been called
    LIBMYSQL_MISSING = 1; // No suitable DLL could be located
    LIBMYSQL_INCOMPATIBLE = 2; // A DLL was found but it is not compatible
    LIBMYSQL_READY = 3; // The DLL was loaded successfully

    var
    libmysql_handle: HMODULE = 0;
    libmysql_status: byte = LIBMYSQL_UNDEFINED;

    {------------------------------------------------------------------------------}
    function IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    function INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    function IS_BLOB(n: longword): boolean;
    function IS_NUM(t: longword): boolean;
    function IS_PRI_KEY(n: longword): boolean;
    function IS_NOT_NULL(n: longword): boolean;

    type
    TDynamicStringArray = array of String;
    TDynamicIntegerArray = array of Integer;

    {------------------------------------------------------------------------------}

    type
    TMysqlComponent = class(TComponent)
    private
    { Private declarations }
    Hostp : String;
    Loginp : String;
    Passwordp : String;
    Databasep : String;
    INIFileNamep : String;
    procedure SetHost (Value : string);
    procedure SetLogin (Value : string);
    procedure SetPassword (Value : string);
    procedure SetDatabase (Value : string);

    procedure assign_proc(var proc: FARPROC; name: pChar);
    function mysql_reload(_mysql: PMySQL): longint;
    function libmysql_load(name: pChar): byte;
    procedure libmysql_free;

    protected
    { Protected declarations }
    public
    { Public declarations }
    name_libmysql : pChar;
    { link a la base }
    Linkp : PMYSQL;
    { ¿on est connecté? }
    Connected : boolean;
    { ¿on s séléctionné la base? }
    Selected : boolean;

    { Public functions }
    mysql_init: function(_mysql: PMYSQL): PMYSQL; stdcall;
    {$IFDEF HAVE_OPENSSL}
    mysql_ssl_set: function(_mysql: PMYSQL; const key, cert, ca, capath: pChar): longint; stdcall;
    mysql_ssl_cipher: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_ssl_clear: function(_mysql: PMYSQL): longint; stdcall;
    {$ENDIF} // HAVE_OPENSSL
    mysql_connect: function(_mysql: PMYSQL; const host, user, passwd: pChar): PMYSQL; stdcall;
    mysql_change_user: function(_mysql: PMYSQL; const user, passwd, db: pChar): my_bool; stdcall;
    mysql_real_connect: function(_mysql: PMYSQL; const host, user, passwd, db: pChar; port: longword; const unix_socket: pChar; clientflag: longword): PMYSQL; stdcall;
    mysql_close: procedure(sock: PMYSQL); stdcall;
    mysql_select_db: function(_mysql: PMYSQL; const db: pChar): longint; stdcall;
    mysql_query: function(_mysql: PMYSQL; const q: pChar): longint; stdcall;
    mysql_send_query: function(_mysql: PMYSQL; const q: pChar; length: longword): longint; stdcall;
    mysql_read_query_result: function(_mysql: PMYSQL): longint; stdcall;
    mysql_real_query: function(_mysql: PMYSQL; const q: pChar; length: longword): longint; stdcall;
    mysql_create_db: function(_mysql: PMYSQL; const DB: pChar): longint; stdcall;
    mysql_drop_db: function(_mysql: PMYSQL; const DB: pChar): longint; stdcall;
    mysql_shutdown: function(_mysql: PMYSQL): longint; stdcall;
    mysql_dump_debug_info: function(_mysql: PMYSQL): longint; stdcall;
    mysql_refresh: function(_mysql: PMYSQL; refresh_options: longword): longint; stdcall;
    mysql_kill: function(_mysql: PMYSQL; pid: longword): longint; stdcall;
    mysql_ping: function(_mysql: PMYSQL): longint; stdcall;
    mysql_stat: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_get_server_info: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_get_client_info: function: pChar; stdcall;
    mysql_get_host_info: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_get_proto_info: function(_mysql: PMYSQL): longword; stdcall;
    mysql_list_dbs: function(_mysql: PMYSQL; const wild: pChar): PMYSQL_RES; stdcall;
    mysql_list_tables: function(_mysql: PMYSQL; const wild: pChar): PMYSQL_RES; stdcall;
    mysql_list_fields: function(_mysql: PMYSQL; const table, wild: pChar): PMYSQL_RES; stdcall;
    mysql_list_processes: function(_mysql: PMYSQL): PMYSQL_RES; stdcall;
    mysql_store_result: function(_mysql: PMYSQL): PMYSQL_RES; stdcall;
    mysql_use_result: function(_mysql: PMYSQL): PMYSQL_RES; stdcall;
    mysql_options: function(_mysql: PMYSQL; option: mysql_option; const arg: pChar): longint; stdcall;
    mysql_free_result: procedure(result: PMYSQL_RES); stdcall;
    free_Result: procedure(result: PMYSQL_RES); stdcall;

    mysql_data_seek: procedure(result: PMYSQL_RES; offset: my_ulonglong); stdcall;
    mysql_row_seek: function(result: PMYSQL_RES; offset: MYSQL_ROW_OFFSET): MYSQL_ROW_OFFSET; stdcall;
    mysql_field_seek: function(result: PMYSQL_RES; offset: MYSQL_FIELD_OFFSET): MYSQL_FIELD_OFFSET; stdcall;
    mysql_fetch_row: function(result: PMYSQL_RES): PMYSQL_ROW; stdcall;
    fetch_row: function(result: PMYSQL_RES): PMYSQL_ROW; stdcall;
    mysql_fetch_lengths: function(result: PMYSQL_RES): PMYSQL_LENGTHS; stdcall;
    mysql_fetch_field: function(result: PMYSQL_RES): PMYSQL_FIELD; stdcall;
    mysql_escape_string: function(_to: pChar; const from: pChar; from_length: longword): longword; stdcall;
    mysql_real_escape_string: function(_mysql: PMYSQL; _to: pChar; const from: pChar; length: longword): longword; stdcall;
    mysql_debug: procedure(const debug: pChar); stdcall;
    mysql_odbc_escape_string: function(_mysql: PMYSQL; _to: pChar; to_length: longword; const from: pChar; from_length: longword; param: pointer; extend_buffer: extend_buffer_func): pChar; stdcall;
    myodbc_remove_escape: procedure(_mysql: PMYSQL; name: pChar); stdcall;
    mysql_thread_safe: function: longword; stdcall;
    mysql_field_count: function(_mysql: PMYSQL): longword; stdcall;
    mysql_affected_rows: function(_mysql: PMYSQL): my_ulonglong; stdcall;
    mysql_insert_id: function(_mysql: PMYSQL): my_ulonglong; stdcall;
    mysql_errno: function(_mysql: PMYSQL): longword; stdcall;
    mysql_error: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_info: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_thread_id: function(_mysql: PMYSQL): longword; stdcall;
    mysql_character_set_name: function(_mysql: PMYSQL): pChar; stdcall;
    mysql_num_rows: function(res: PMYSQL_RES): my_ulonglong; stdcall;
    num_rows: function(res: PMYSQL_RES): my_ulonglong; stdcall;
    mysql_num_fields: function(res: PMYSQL_RES): longword; stdcall;
    num_fields: function(res: PMYSQL_RES): longword; stdcall;
    mysql_eof: function(res: PMYSQL_RES): my_bool; stdcall;
    mysql_fetch_field_direct: function(res: PMYSQL_RES; fieldnr: longword): PMYSQL_FIELD; stdcall;
    fetch_field_direct: function(res: PMYSQL_RES; fieldnr: longword): PMYSQL_FIELD; stdcall;
    mysql_fetch_fields: function(res: PMYSQL_RES): PMYSQL_FIELDS; stdcall;
    mysql_row_tell: function(res: PMYSQL_RES): PMYSQL_ROWS; stdcall;
    mysql_field_tell: function(res: PMYSQL_RES): longword; stdcall;

    Constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;

    function IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    function INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    function IS_BLOB(n: longword): boolean;
    function IS_NUM(t: longword): boolean;
    function IS_PRI_KEY(n: longword): boolean;
    function IS_NOT_NULL(n: longword): boolean;
    function IS_AUTO_INCREMENT(n: longword): boolean;

    { redefinition de fonctions de base pour le composant }
    function Connect : integer;
    procedure Close;
    function Query (requete : PChar) : PMYSQL_RES; overload;
    function Query (requete : String) : PMYSQL_RES; overload;


    procedure LoadFromINI; overload;
    procedure LoadFromINI (FileName : String); overload;
    procedure SaveToINI; overload;
    procedure SaveToINI (FileName : String); overload;

    function SaveTableToFile (Table, Filename: string): boolean; overload;
    function SaveTableToFile (Table, Filename: string;
    Append,TableRef,DelData,DropTable : boolean): boolean; overload;
    // function SaveTableToXLS(FileName, Table: string) : boolean;

    procedure SaveBaseToFile(FileName : String;
    Append,TableRef,DelData,DropTable : boolean); overload;
    procedure SaveBaseToFile(FileName, DatabaseToSave : String;
    Append,TableRef,DelData,DropTable : boolean); overload;


    function field_Details_descr(Field : PMYSQL_FIELD) : string;
    function field_MysqlType (Field : PMYSQL_FIELD) : string;

    function add_slashes (mot : string) : string;

    function AddTableToFile(Table, Filename: string): boolean;
    function LoadSQLFromFile(Filename: string): boolean;

    procedure ListDBsInTStrings (var Items : TStrings);
    procedure ListDBsInListBox (ListBox : TListBox);
    procedure ListFieldsInListBox (ListBox : TListBox;Table : string);
    procedure ListTablesInListBox (ListBox : TListBox;Database : string);

    procedure ListInListBox (ListBox : TListBox;Res: PMYSQL_RES);

    procedure ListTablesInTStrings (var Items : TStrings); overload;
    procedure ListTablesInTStrings (var Items : TStrings;Database : string); overload;

    function List_Tables (DatabaseToList : string) : PMYSQL_RES;
    function list_dbs (wild: string): PMYSQL_RES;
    function list_fields (table, wild: string): PMYSQL_RES;

    procedure ListFieldsInTStrings (var Items : TStrings;Table : string);
    procedure ListInTStrings (var Items : TStrings;Res: PMYSQL_RES);

    function QueryIntoTStrings (Querys : string;var Items : TStrings) : boolean;

    function QueryFirstResult (Querys : string;var FirstRowZero : string) : boolean;
    function fields_type (Table : string;var Fields_names : TDynamicStringArray;var Fields_types : TDynamicIntegerArray) : integer;
    function field_ConversionType_Nomtype (no : integer ) : string;
    function field_ConversionNomtype_Type (nom : string) : integer;

    function table_change_name (hold_name, new_name : string) : boolean;
    function create_table (name,query_table : string) : boolean;
    function delete_table (name : string) : boolean;

    // function QueryIntoTStrings (Querys : string;var Strings : TStrings) : boolean;
    function QueryIntoTStringsUnique (Querys : string;var Strings : TStrings) : boolean;

    function field_count(): longword;

    published
    { Published declarations }
    property Host : string read Hostp write SetHost;
    property Login : string read Loginp write SetLogin;
    property Password : string read Passwordp write SetPassword;
    property Database : string read Databasep write SetDatabase;
    property INIFileName : string read INIFileNamep write INIFileNamep;


    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Mysql DB', [TMysqlComponent]);
    end;

    {------------------------------------------------------------------------------}

    Constructor TMySqlComponent.Create(AOwner:TComponent);
    begin
    InHerited Create(AOwner);
    name_libmysql := 'libmysql.dll';
    if (csDesigning in ComponentState) then
    begin
    // si on est en mode conception
    { Definition des variables }
    Host := 'localhost';
    Login := 'root';
    Password := '';
    Database := 'test';
    INIFileName := 'MySqlComponent.ini';
    end
    else
    begin
    // si on est en mode execution
    libmysql_load(nil);
    end;
    end;

    destructor TMySqlComponent.Destroy;
    begin
    if (csDesigning in ComponentState) then
    begin

    end
    else
    begin
    libmysql_free;
    end;
    InHerited Destroy;
    end;

    {------------------------------------------------------------------------------}

    function IS_PRI_KEY(n: longword): boolean;
    begin
    IS_PRI_KEY := (n and PRI_KEY_FLAG) = PRI_KEY_FLAG;
    end;

    function IS_NOT_NULL(n: longword): boolean;
    begin
    IS_NOT_NULL := (n and NOT_NULL_FLAG) = NOT_NULL_FLAG;
    end;

    function IS_BLOB(n: longword): boolean;
    begin
    IS_BLOB := (n and BLOB_FLAG) = BLOB_FLAG;
    end;

    function IS_NUM(t: longword): boolean;
    begin
    IS_NUM := (t <= FIELD_TYPE_INT24) or (t = FIELD_TYPE_YEAR);
    end;

    function IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
    IS_NUM_FIELD := (f.flags and NUM_FLAG) = NUM_FLAG;
    end;

    function INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
    INTERNAL_NUM_FIELD := (((f._type <= FIELD_TYPE_INT24) and ((f._type <> FIELD_TYPE_TIMESTAMP) or (f.length = 14) or (f.length = 8))) or (f._type = FIELD_TYPE_YEAR));
    end;

    function IS_AUTO_INCREMENT(n: longword): boolean;
    begin
    IS_AUTO_INCREMENT := (n and AUTO_INCREMENT_FLAG) = AUTO_INCREMENT_FLAG;
    end;

    {------------------------------------------------------------------------------}

    function TMySqlComponent.IS_PRI_KEY(n: longword): boolean;
    begin
    IS_PRI_KEY := (n and PRI_KEY_FLAG) = PRI_KEY_FLAG;
    end;

    function TMySqlComponent.IS_NOT_NULL(n: longword): boolean;
    begin
    IS_NOT_NULL := (n and NOT_NULL_FLAG) = NOT_NULL_FLAG;
    end;

    function TMySqlComponent.IS_BLOB(n: longword): boolean;
    begin
    IS_BLOB := (n and BLOB_FLAG) = BLOB_FLAG;
    end;

    function TMySqlComponent.IS_NUM(t: longword): boolean;
    begin
    IS_NUM := (t <= FIELD_TYPE_INT24) or (t = FIELD_TYPE_YEAR);
    end;

    function TMySqlComponent.IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
    IS_NUM_FIELD := (f.flags and NUM_FLAG) = NUM_FLAG;
    end;

    function TMySqlComponent.INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
    INTERNAL_NUM_FIELD := (((f._type <= FIELD_TYPE_INT24) and ((f._type <> FIELD_TYPE_TIMESTAMP) or (f.length = 14) or (f.length = 8))) or (f._type = FIELD_TYPE_YEAR));
    end;

    function TMySqlComponent.IS_AUTO_INCREMENT(n: longword): boolean;
    begin
    IS_AUTO_INCREMENT := (n and AUTO_INCREMENT_FLAG) = AUTO_INCREMENT_FLAG;
    end;

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut Delphi7 et TMySqlComponent
    { La suite }

    {------------------------------------------------------------------------------}

    procedure TMySQLComponent.SetHost (Value : string);
    begin
    if (not Connected) then Hostp := Value;
    end;

    procedure TMySQLComponent.SetLogin (Value : string);
    begin
    if (not Connected) then Loginp := Value;
    end;

    procedure TMySQLComponent.SetPassword (Value : string);
    begin
    if (not Connected) then Passwordp := Value;
    end;

    procedure TMySQLComponent.SetDatabase (Value : string);
    begin
    if (not Connected) then Databasep := Value;
    end;

    {------------------------------------------------------------------------------}

    function TMysqlComponent.mysql_reload(_mysql: PMYSQL): longint;
    begin
    mysql_reload := mysql_refresh(_mysql, REFRESH_GRANT);
    end;

    procedure TMysqlComponent.assign_proc(var proc: FARPROC; name: pChar);
    begin
    proc := GetProcAddress(libmysql_handle, name);
    if proc = nil then libmysql_status := LIBMYSQL_INCOMPATIBLE;
    end;

    function TMysqlComponent.libmysql_load(name: pChar): byte;
    begin
    libmysql_free;
    if name = nil then name := 'libmysql.dll';
    libmysql_handle := LoadLibrary(name);
    if libmysql_handle = 0 then libmysql_status := LIBMYSQL_MISSING
    else begin
    libmysql_status := LIBMYSQL_READY;
    assign_proc(@mysql_num_rows, 'mysql_num_rows');
    assign_proc(@num_rows, 'mysql_num_rows');
    assign_proc(@mysql_num_fields, 'mysql_num_fields');
    assign_proc(@num_fields, 'mysql_num_fields');
    assign_proc(@mysql_eof, 'mysql_eof');
    assign_proc(@mysql_fetch_field_direct, 'mysql_fetch_field_direct');
    assign_proc(@fetch_field_direct, 'mysql_fetch_field_direct');
    assign_proc(@mysql_fetch_fields, 'mysql_fetch_fields');
    assign_proc(@mysql_row_tell, 'mysql_row_tell');
    assign_proc(@mysql_field_tell, 'mysql_field_tell');
    assign_proc(@mysql_field_count, 'mysql_field_count');
    assign_proc(@mysql_affected_rows, 'mysql_affected_rows');
    assign_proc(@mysql_insert_id, 'mysql_insert_id');
    assign_proc(@mysql_errno, 'mysql_errno');
    assign_proc(@mysql_error, 'mysql_error');
    assign_proc(@mysql_info, 'mysql_info');
    assign_proc(@mysql_thread_id, 'mysql_thread_id');
    assign_proc(@mysql_character_set_name, 'mysql_character_set_name');
    assign_proc(@mysql_init, 'mysql_init');
    {$IFDEF HAVE_OPENSSL}
    assign_proc(@mysql_ssl_set, 'mysql_ssl_set');
    assign_proc(@mysql_ssl_cipher, 'mysql_ssl_cipher');
    assign_proc(@mysql_ssl_clear, 'mysql_ssl_clear');
    {$ENDIF} // HAVE_OPENSSL
    assign_proc(@mysql_connect, 'mysql_connect');
    assign_proc(@mysql_change_user, 'mysql_change_user');
    assign_proc(@mysql_real_connect, 'mysql_real_connect');
    assign_proc(@mysql_close, 'mysql_close');
    assign_proc(@mysql_select_db, 'mysql_select_db');
    assign_proc(@mysql_query, 'mysql_query');
    assign_proc(@mysql_send_query, 'mysql_send_query');
    assign_proc(@mysql_read_query_result, 'mysql_read_query_result');
    assign_proc(@mysql_real_query, 'mysql_real_query');
    assign_proc(@mysql_create_db, 'mysql_create_db');
    assign_proc(@mysql_drop_db, 'mysql_drop_db');
    assign_proc(@mysql_shutdown, 'mysql_shutdown');
    assign_proc(@mysql_dump_debug_info, 'mysql_dump_debug_info');
    assign_proc(@mysql_refresh, 'mysql_refresh');
    assign_proc(@mysql_kill, 'mysql_kill');
    assign_proc(@mysql_ping, 'mysql_ping');
    assign_proc(@mysql_stat, 'mysql_stat');
    assign_proc(@mysql_get_server_info, 'mysql_get_server_info');
    assign_proc(@mysql_get_client_info, 'mysql_get_client_info');
    assign_proc(@mysql_get_host_info, 'mysql_get_host_info');
    assign_proc(@mysql_get_proto_info, 'mysql_get_proto_info');
    assign_proc(@mysql_list_dbs, 'mysql_list_dbs');
    assign_proc(@mysql_list_tables, 'mysql_list_tables');
    assign_proc(@mysql_list_fields, 'mysql_list_fields');
    assign_proc(@mysql_list_processes, 'mysql_list_processes');
    assign_proc(@mysql_store_result, 'mysql_store_result');
    assign_proc(@mysql_use_result, 'mysql_use_result');
    assign_proc(@mysql_options, 'mysql_options');
    assign_proc(@mysql_free_result, 'mysql_free_result');
    assign_proc(@free_result, 'mysql_free_result');
    assign_proc(@mysql_data_seek, 'mysql_data_seek');
    assign_proc(@mysql_row_seek, 'mysql_row_seek');
    assign_proc(@mysql_field_seek, 'mysql_field_seek');
    assign_proc(@mysql_fetch_row, 'mysql_fetch_row');
    assign_proc(@fetch_row, 'mysql_fetch_row');
    assign_proc(@mysql_fetch_lengths, 'mysql_fetch_lengths');
    assign_proc(@mysql_fetch_field, 'mysql_fetch_field');
    assign_proc(@mysql_escape_string, 'mysql_escape_string');
    assign_proc(@mysql_real_escape_string, 'mysql_real_escape_string');
    assign_proc(@mysql_debug, 'mysql_debug');
    assign_proc(@mysql_odbc_escape_string, 'mysql_odbc_escape_string');
    assign_proc(@myodbc_remove_escape, 'myodbc_remove_escape');
    assign_proc(@mysql_thread_safe, 'mysql_thread_safe');
    end;
    libmysql_load := libmysql_status;
    end;

    procedure TMysqlComponent.libmysql_free;
    begin
    if libmysql_handle <> 0 then FreeLibrary(libmysql_handle);
    libmysql_handle := 0;
    libmysql_status := LIBMYSQL_UNDEFINED;
    end;

    {------------------------------------------------------------------------------}
    {------------------------------------------------------------------------------}

    function TMySQLComponent.Connect : integer;
    begin
    if (not Connected) or (not Selected) then
    begin
    Linkp := mysql_init(nil);
    if (mysql_connect(Linkp, PChar(Hostp), PChar(Loginp), PChar(Passwordp)) = nil) then
    begin
    Connected := false;
    Connect := -1;
    exit;
    end
    else
    begin
    Connected := true;
    if (mysql_select_db(Linkp, PChar(Databasep))<>0) then
    begin
    Selected := false;
    Connect := -2;
    exit;
    end;
    Selected := true;
    end;
    end;
    Connect := 0;
    end;

    procedure TMySQLComponent.Close;
    begin
    if Connected = true then
    begin
    mysql_close(Linkp);
    Connected := False;
    Selected := False;
    end;
    end;


    function TMySQLComponent.Query (requete : String) : PMYSQL_RES;
    begin
    Query := Query (PChar(requete));
    end;
    function TMySQLComponent.Query (requete : PChar) : PMYSQL_RES;
    begin
    if mysql_query(Linkp, requete) <> 0 then
    begin
    Query := nil;
    exit;
    end;
    Query := mysql_store_result(Linkp);
    end;


    procedure TMySQLComponent.LoadFromIni;
    begin
    LoadFromIni (INIFileNamep);
    end;
    procedure TMySQLComponent.LoadFromIni (Filename : String);
    var
    MyIniFile: TIniFile;
    begin
    {chargement du fichier de configuration}
    MyIniFile := TIniFile.Create(Filename);
    with MyIniFile do
    begin
    Hostp := ReadString('MYSQL CONFIG', 'host', 'localhost');
    Loginp := ReadString('MYSQL CONFIG', 'login', 'root');
    Passwordp := ReadString('MYSQL CONFIG', 'password', '');
    Databasep := ReadString('MYSQL CONFIG', 'database', 'test');
    end;
    MyIniFile.Free;
    end;

    procedure TMySQLComponent.SaveToIni;
    begin
    SaveToIni (INIFileNamep);
    end;
    procedure TMySQLComponent.SaveToIni (Filename : String);
    var
    MyIniFile: TIniFile;
    begin
    {chargement du fichier de configuration}
    MyIniFile := TIniFile.Create(Filename);
    with MyIniFile do
    begin
    WriteString('MYSQL CONFIG', 'host' , Hostp);
    WriteString('MYSQL CONFIG', 'login' , Loginp);
    WriteString('MYSQL CONFIG', 'password', Passwordp);
    WriteString('MYSQL CONFIG', 'database', Databasep);
    end;
    MyIniFile.Free;
    end;


    function TMySQLComponent.SaveTableToFile (Table, Filename: string): boolean;
    begin
    SaveTableToFile := SaveTableToFile (Table, Filename,False,False,False,False);
    end;
    function TMySQLComponent.SaveTableToFile (Table, Filename: string;
    Append,TableRef,DelData,DropTable : boolean): boolean;
    var
    Fichier: TextFile;
    Res: PMYSQL_RES;
    Row: PMYSQL_ROW;
    i : integer;
    Fields : PMYSQL_FIELD;
    Querys,
    underq,
    FieldsT,FieldsFin : string;
    begin
    AssignFile(Fichier,FileName);
    if (not FileExists(FileName)) or (not Append)
    then Rewrite (Fichier)
    else System.Append (Fichier);
    Res := Query ('SELECT * FROM '+Table+';');
    if Res = nil then begin
    SaveTableToFile := false;
    end
    else
    try
    {Tag}
    Writeln(Fichier,
    '#--------------------------------------------'+#13+
    '# Table '+Table+#13+
    '# Sauvegarde du '+DateToStr(Date)+#13+
    '#--------------------------------------------');
    {Effacer les enregistrements precedents}

    if DropTable then Writeln(Fichier,'DROP TABLE IF EXISTS '+Table+';');


    FieldsT := 'CREATE TABLE '+Table+' (';
    FieldsFin := '';

    querys := 'INSERT INTO '+Table+' (';
    for i := 0 to mysql_num_fields(Res)-1 Do
    begin
    Fields := mysql_fetch_field_direct(Res,i);
    {primary key}
    if IS_PRI_KEY(Fields.flags) then
    begin
    if FieldsFin=''
    then FieldsFin := Fields.name
    else FieldsFin := FieldsFin + ','+Fields.name;
    end;
    {champs}
    if i = 0 then
    begin
    Querys := Querys +'`'+Fields.name+'`';
    FieldsT := FieldsT + #13+field_Details_descr(Fields);
    end
    else
    begin
    Querys := Querys +',`'+Fields.name+'`';
    FieldsT := FieldsT +','+#13+field_Details_descr(Fields);
    end;
    end;
    {rajoute primary key}
    if FieldsFin <> '' then
    FieldsT := FieldsT +#13+', PRIMARY KEY ('+FieldsFin+')';
    FieldsT := FieldsT + ');';
    Querys := Querys + ') VALUES (';
    if TableRef then Writeln(Fichier,FieldsT);
    if DelData then Writeln(Fichier,'DELETE FROM '+Table+';');
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    underq := '';
    for i := 0 to mysql_num_fields(Res)-1 Do
    begin
    if i = 0 then
    underq := underq +''''+add_slashes(Row[i])+''''
    else
    underq := underq +','''+add_slashes(Row[i])+'''';
    end;
    underq := Querys + underq + ');';
    Writeln(Fichier,underq);
    Row := mysql_fetch_row(Res);
    end;
    finally
    free_result(Res);
    SaveTableToFile := true;
    end;
    CloseFile(Fichier);
    end;

    function TMySQLComponent.AddTableToFile(Table, Filename: string): boolean;
    var
    Res: PMYSQL_RES;
    Row: PMYSQL_ROW;
    i : integer;
    Fields : PMYSQL_FIELD;
    Querys : string;
    underq : string;
    Fichier: TextFile;
    begin
    Assignfile(Fichier,Filename);
    Append (Fichier);
    Res := Query ('SELECT * FROM '+Table+';');
    if Res = nil then begin
    AddTableToFile := false;
    end
    else
    try
    querys := 'INSERT INTO '+Table+' (';
    for i := 0 to mysql_num_fields(Res)-1 Do
    begin
    Fields := mysql_fetch_field_direct(Res,i);
    if i = 0 then
    Querys := Querys +'`'+Fields.name+'`'
    else
    Querys := Querys +',`'+Fields.name+'`';
    end;
    Querys := Querys + ') VALUES (';

    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    underq := '';
    for i := 0 to mysql_num_fields(Res)-1 Do
    begin
    if i = 0 then
    underq := underq +''''+add_slashes(Row[i])+''''
    else
    underq := underq +','''+add_slashes(Row[i])+'''';
    end;
    underq := Querys + underq + ');';
    Writeln(Fichier,underq);
    Row := mysql_fetch_row(Res);
    end;
    finally
    free_result(Res);
    AddTableToFile := true;
    end;
    Closefile(Fichier);
    end;

    function TMySQLComponent.List_Tables (DatabaseToList : string) : PMYSQL_RES;
    var
    Res : PMYSQL_RES;
    begin
    if Selected = true then
    begin
    if (DatabaseToList<>'') and (DatabaseToList<>Databasep) then
    begin
    Close;
    Databasep := DatabaseToList;
    Connect;
    end;
    Res := query('SHOW tables ;');
    List_Tables := Res;
    end
    else List_Tables := nil;
    end;

    function TMySQLComponent.list_dbs (wild: string): PMYSQL_RES;
    begin
    list_dbs := mysql_list_dbs(Linkp,PChar(wild));
    end;

    procedure TMySQLComponent.SaveBaseToFile(FileName : String;
    Append,TableRef,DelData,DropTable : boolean);
    begin
    SaveBaseToFile(FileName, '',Append,TableRef,DelData,DropTable);
    end;


    procedure TMySQLComponent.SaveBaseToFile(FileName, DatabaseToSave : String;
    Append,TableRef,DelData,DropTable : boolean);
    var
    Res: PMYSQL_RES;
    Row: PMYSQL_ROW;
    begin
    if Selected = true then
    begin
    if (DatabaseToSave<>'') and (DatabaseToSave<>Databasep) then
    begin
    Close;
    Databasep := DatabaseToSave;
    Connect;
    end;
    Res := list_tables('');
    if Res <> nil then
    begin
    try
    Row := mysql_fetch_row(Res);
    if Row <> nil then SaveTableToFile (Row[0],Filename,Append,TableRef,DelData,DropTable);
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    SaveTableToFile (Row[0],Filename,True,TableRef,DelData,DropTable);
    Row := mysql_fetch_row(Res);
    end;
    finally
    mysql_free_result(Res);
    end;
    end;
    end;
    end;



    function LineFeedsToXLS(s:string):string;
    var
    Res: string;
    i: Integer;
    begin
    Res := '';
    for i := 1 to Length(s) do
    if s[i] <> #13 then
    Res := Res + s[i];
    LineFeedsToXls:=res;
    end;

    {function TMySQLComponent.SaveTableToXLS(FileName, Table: string) : boolean;
    var
    { sauver sous excel }
    { FExcel: Variant;
    FWorkbook: Variant;
    FWorksheet: Variant;
    FArray: Variant;
    s,z: Integer;
    RangeStr: string;
    StrtCol,StrtRow: Integer;
    newbook: Boolean;
    { aller chercher les infos dans la base }
    { Res: PMYSQL_RES;
    Row: PMYSQL_ROW;
    i : integer;
    Fields : PMYSQL_FIELD;
    Querys,
    underq,
    FieldsT,FieldsFin : string;
    RowCount,
    ColCount : cardinal;
    begin
    Res := Query ('SELECT * FROM '+Table+';');
    if Res = nil then
    begin
    SaveTableToXLS := false;
    exit;
    end
    else
    // try
    { Titres des colonnes }
    { for i := 0 to mysql_num_fields(Res)-1 Do
    begin
    Fields := mysql_fetch_field_direct(Res,i);
    // Fields.name
    end;
    { creation fichier excel }
    { try
    FExcel := CreateOleObject('excel.application');
    SaveTableToXLS := false;
    except
    SaveTableToXLS := false;
    Exit;
    end;
    newbook := True;

    if Table = '' then
    begin
    FWorkBook := FExcel.WorkBooks.Add;
    FWorkSheet := FWorkBook.WorkSheets.Add;
    end
    else
    begin
    FWorkBook := FExcel.WorkBooks.Open(Filename);
    if VarIsEmpty(FWorkBook)
    then FWorkBook := FExcel.WorkBooks.Add
    else newbook := False;

    FWorkSheet := unAssigned;
    for s := 1 to FWorkbook.Sheets.Count do
    if (FWorkBook.Sheets[s].Name = Table) then
    FWorkSheet := FWorkBook.Sheets[s];

    if VarIsEmpty(FWorksheet) then
    begin
    FWorkSheet := FWorkBook.WorkSheets.Add;
    FWorkSheet.Name := Table;
    end;
    end;


    { -------- RowCount - ColCount }
    // RowCount := mysql_num_rows;
    // RowCount := mysql_num_fields;

    { FArray := VarArrayCreate([0,{RowCount -} {1 - StrtRow,0, {ColCount -}{ 1 - StrtCol],VarVariant);

    { for s := StrtRow to {RowCount -}{ 1 {do
    { begin
    for z := StrtCol to {ColCount - }{1 {do
    begin
    // FArray[s - StrtRow,z - StrtCol] := '"' + LineFeedsToXLS(SaveCell(RemapCol(z),s)) + '"';
    FArray[s - StrtRow,z - StrtCol] := LineFeedsToXLS('Case a sauvegarder');
    end;
    end;

    RangeStr := 'A1:';

    if ({ColCount -}{ StrtCol) > 26 then
    begin
    if ({ColCount - }{StrtCol) mod 26 = 0 then
    begin
    RangeStr := RangeStr + Chr(Ord('A') - 2 + (({ColCount -}{ StrtCol) div 26));
    RangeStr := RangeStr + 'Z';
    end
    else
    begin
    RangeStr := RangeStr + Chr(Ord('A') - 1 + (({ColCount - }{StrtCol) div 26));
    RangeStr := RangeStr + Chr(Ord('A') - 1 + (({ColCount - }{StrtCol) mod 26));
    end;
    end
    else
    RangeStr := RangeStr + Chr(Ord('A') - 1 + ({ColCount -}{ StrtCol));

    RangeStr := RangeStr + IntToStr({RowCount -}{ StrtRow);

    FWorkSheet.Range[rangestr].Value := FArray;

    if newbook then
    FWorkbook.SaveAs(filename)
    else
    FWorkbook.Save;

    FExcel.Quit;
    FExcel := unAssigned;
    end; }

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut Delphi7 et TMySqlComponent
    { Suite et Fin }


    function TMySQLComponent.field_Details_descr(Field : PMYSQL_FIELD) : string;
    var
    s : string;
    begin
    {reprend les informations du champs afin d'en faire une chaine qui servira
    a créer une table
    name: pChar; // Name of column
    table: pChar; // Table of column if column was a field
    def: pChar; // Default value (set by mysql_list_fields)
    _type: enum_field_types; // Type of field. Se mysql_com.h for types
    length: longword; // Width of column
    max_length: longword; // Max width of selected set
    flags: longword; // Div flags
    decimals: longword; // Number of decimals in field

    function IS_PRI_KEY(n: longword): boolean;
    function IS_NOT_NULL(n: longword): boolean;
    function IS_BLOB(n: longword): boolean;
    function IS_NUM(t: longword): boolean;

    id tinyint(4) NOT NULL auto_increment,
    }
    s := Field.name+' '+field_MysqlType(Field);
    // field.def
    field_Details_descr := s;
    end;

    function TMySQLComponent.field_MysqlType (Field : PMYSQL_FIELD) : string;
    var
    s : string;
    no : longword;
    begin
    s := '';
    no := Field._type;

    {type TINYTEXT}
    // if not IS_BLOB(Field.flags) then
    begin
    case no of
    252 : begin
    case Field.length of
    255 : no := FIELD_TYPE_TINYTEXT;
    65535 : no := FIELD_TYPE_TEXT;
    16777215 : no := FIELD_TYPE_MEDIUMTEXT;
    // 4294967296 : no := FIELD_TYPE_LONGTEXT;
    end;
    end;
    end;
    end;{
    else
    begin
    case no of
    252 : begin
    case Field.length of
    255 : no := FIELD_TYPE_TINY_BLOB;
    65535 : no := FIELD_TYPE_BLOB;
    16777215 : no := FIELD_TYPE_MEDIUM_BLOB;
    // 4294967296 : no := FIELD_TYPE_LONG_BLOB;
    end;
    end;
    end;
    end; }


    case no of
    FIELD_TYPE_DECIMAL : s := STRING1_FIELD_TYPE_DECIMAL;
    FIELD_TYPE_TINY : s := STRING1_FIELD_TYPE_TINY;
    FIELD_TYPE_SHORT : s := STRING1_FIELD_TYPE_SHORT;
    FIELD_TYPE_LONG : s := STRING1_FIELD_TYPE_LONG;
    FIELD_TYPE_FLOAT : s := STRING1_FIELD_TYPE_FLOAT;
    FIELD_TYPE_DOUBLE : s := STRING1_FIELD_TYPE_DOUBLE;
    FIELD_TYPE_NULL : s := STRING1_FIELD_TYPE_NULL;
    FIELD_TYPE_TIMESTAMP : s := STRING1_FIELD_TYPE_TIMESTAMP;
    FIELD_TYPE_LONGLONG : s := STRING1_FIELD_TYPE_LONGLONG;
    FIELD_TYPE_INT24 : s := STRING1_FIELD_TYPE_INT24;
    FIELD_TYPE_DATE : s := STRING1_FIELD_TYPE_DATE;
    FIELD_TYPE_TIME : s := STRING1_FIELD_TYPE_TIME;
    FIELD_TYPE_DATETIME: s := STRING1_FIELD_TYPE_DATETIME;
    FIELD_TYPE_YEAR : s := STRING1_FIELD_TYPE_YEAR;
    FIELD_TYPE_NEWDATE : s := STRING1_FIELD_TYPE_NEWDATE;
    FIELD_TYPE_ENUM : begin
    s := STRING1_FIELD_TYPE_ENUM + '('+field.def+')';
    end;
    FIELD_TYPE_SET : s := STRING1_FIELD_TYPE_SET;
    {BLOB}
    FIELD_TYPE_TINY_BLOB: s := STRING1_FIELD_TYPE_TINY_BLOB;
    FIELD_TYPE_MEDIUM_BLOB: s := STRING1_FIELD_TYPE_MEDIUM_BLOB;
    FIELD_TYPE_LONG_BLOB: s := STRING1_FIELD_TYPE_LONG_BLOB;
    FIELD_TYPE_BLOB: s := STRING1_FIELD_TYPE_BLOB;

    {TEXT}
    FIELD_TYPE_VAR_STRING: s := STRING1_FIELD_TYPE_VAR_STRING;
    FIELD_TYPE_STRING: s := STRING1_FIELD_TYPE_STRING;

    FIELD_TYPE_TINYTEXT : s := STRING1_FIELD_TYPE_TINYTEXT;
    FIELD_TYPE_TEXT : s := STRING1_FIELD_TYPE_TEXT;
    FIELD_TYPE_MEDIUMTEXT : s := STRING1_FIELD_TYPE_MEDIUMTEXT;
    FIELD_TYPE_LONGTEXT : s := STRING1_FIELD_TYPE_LONGTEXT;

    end;
    {ajout ou non de (xxx) au type}
    if ((no < 249) and (Field.length>0)) or
    (no = FIELD_TYPE_BLOB) or
    (no = FIELD_TYPE_STRING)
    then s := s +'('+IntToStr(Field.length)+')';

    {ajout des Flags
    ENUM_FLAG = 256; // field is an enum
    AUTO_INCREMENT_FLAG = 512; // field is a autoincrement field
    TIMESTAMP_FLAG = 1024; // Field is a timestamp
    SET_FLAG = 2048; // field is a set
    NUM_FLAG = 32768; // Field is num (for clients)
    PART_KEY_FLAG = 16384; // Intern; Part of some key
    GROUP_FLAG = 32768; // Intern: Group field
    UNIQUE_FLAG = 65536; // Intern: Used by sql_yacc
    }
    if IS_NOT_NULL(Field.flags) then s := s +' NOT NULL ';
    if IS_AUTO_INCREMENT(Field.flags) then s := s + ' auto_increment ';
    field_MysqlType := s;
    end;

    function TMySQLComponent.add_slashes (mot : string) : string;
    var
    i : integer;
    t : string;
    begin
    t := '';
    for i := 1 to StrLen(PChar(mot)) do
    if mot[i] = '''' then t := t + '\'''
    else t := t + mot[i];
    add_slashes := t;
    end;

    procedure TMySQLComponent.ListDBsInTStrings (var Items : TStrings);
    var
    Res: PMYSQL_RES;
    begin
    if Connected = true then
    begin
    Res := list_dbs(PChar('%'));
    if Res <> nil then
    ListInTStrings(Items,Res);
    end;
    end;

    procedure TMySQLComponent.ListDBsInListBox (ListBox : TListBox);
    var
    Res: PMYSQL_RES;
    begin
    if Connected = true then
    begin
    Res := list_dbs('%');
    if Res <> nil then
    ListinListBox(ListBox,Res);
    end;
    end;

    procedure TMySQLComponent.ListTablesInTStrings (var Items : TStrings);
    begin
    ListTablesInTStrings (Items,'');
    end;
    procedure TMySQLComponent.ListTablesInTStrings (var Items : TStrings;Database : string);
    var
    Res: PMYSQL_RES;
    begin
    if Selected = true then
    begin
    if (Database<>'') and (Database<>Databasep) then
    begin
    Close;
    Databasep := Database;
    Connect;
    end;
    Res := query('SHOW tables ;');
    if Res <> nil
    then ListInTStrings(Items,Res)
    else items.Clear;
    end;
    end;

    procedure TMySQLComponent.ListFieldsInTStrings (var Items : TStrings;Table : string);
    var
    Res: PMYSQL_RES;
    begin
    if Selected = true then
    begin
    Res := query('SHOW COLUMNS FROM '+table+' LIKE '''+Table+''' ;');
    if Res <> nil
    then ListInTStrings(Items,Res)
    else items.Clear;
    end;
    end;

    function TMySQLComponent.LoadSqlFromFile(Filename: string): boolean;
    var
    Querys : string;
    Fichier: TextFile;
    begin
    Assignfile(Fichier,Filename);
    try
    Reset (Fichier);
    while (System.Eof(Fichier) <> true) do
    begin
    Readln(Fichier,Querys);
    Query(Querys);
    end;
    except
    LoadSqlFromFile := False;
    exit;
    end;
    LoadSqlFromFile := true;
    end;

    procedure TMySQLComponent.ListInTStrings (var Items : TStrings;Res: PMYSQL_RES);
    var
    Row: PMYSQL_ROW;
    begin
    if Res <> nil then
    begin
    Items.Clear;
    if Res <> nil then
    try
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    Items.Add(Row[0]);
    Row := mysql_fetch_row(Res);
    end;
    finally
    mysql_free_result(Res);
    end;
    end;
    end;

    function TMySQLComponent.QueryIntoTStrings (Querys : string;var Items : TStrings) : boolean;
    var
    Res : PMYSQL_RES;
    Row : PMYSQL_ROW;
    i,j : integer;
    s : string;
    begin
    if Selected = true then
    begin
    Res := Query (Querys);
    if Res = nil then
    begin
    QueryIntoTStrings := false;
    exit;
    end
    else
    try
    Items.Clear;
    i := mysql_num_fields (Res);
    if (i > 1) then
    begin
    Row := mysql_fetch_row(Res);
    i := i - 2;
    while Row <> nil do
    begin
    s := Row[0] + ' (';
    for j := 1 to i do
    s := s + Row[j]+ ',';
    s := s + Row[i+1] + ')';
    Items.Add(s);
    Row := mysql_fetch_row(Res);
    end;
    end
    else
    begin
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    Items.Add(Row[0]);
    Row := mysql_fetch_row(Res);
    end;
    end;
    finally
    mysql_free_result(Res);
    end;
    QueryIntoTStrings := true;
    exit;
    end;
    QueryIntoTStrings := false;
    end;

    function TMySQLComponent.QueryFirstResult (Querys : string;var FirstRowZero : string) : boolean;
    var
    Res : PMYSQL_RES;
    Row : PMYSQL_ROW;
    begin
    Res := Query (Querys);
    if Res = nil then QueryFirstResult := false
    else
    try
    Row := mysql_fetch_row(Res);
    if Row <> nil then
    begin
    FirstRowZero := Row[0];
    QueryFirstResult := true;
    end
    else QueryFirstResult := false;
    finally
    mysql_free_result(Res);
    end;
    end;

    function TMySQLComponent.fields_type (Table : string;var Fields_names : TDynamicStringArray;var Fields_types : TDynamicIntegerArray) : integer;
    var
    Res : PMYSQL_RES;
    Field : PMYSQL_FIELD;
    Num,i : Integer;
    Fields_name_result : TDynamicStringArray;
    Fields_type_result : TDynamicIntegerArray;
    begin
    if Selected = true then
    begin
    Num := -1;
    Res := Query ('SELECT * FROM '+Table+' LIMIT 0,1;');
    if Res = nil then fields_type := -1
    else
    try
    Num := mysql_num_fields (Res);
    SetLength (Fields_name_result,Num);
    SetLength (Fields_type_result,Num);
    for i := 0 to (Num-1) do
    begin
    Field := mysql_fetch_field_direct(Res,i);
    Fields_name_result[i] := Field.name;
    Fields_type_result[i] := Field._type;
    end;
    finally
    mysql_free_result(Res);
    fields_type := Num;
    Fields_names := Fields_name_result;
    Fields_types := Fields_type_result;
    end;
    exit;
    end;
    fields_type := -1 ;
    end;

    function TMySQLComponent.field_ConversionType_Nomtype (no : integer) : string;
    var
    s : string;
    begin
    s := '';
    case no of
    FIELD_TYPE_DECIMAL: s := STRING_FIELD_TYPE_DECIMAL;
    FIELD_TYPE_TINY: s := STRING_FIELD_TYPE_TINY;
    FIELD_TYPE_SHORT: s := STRING_FIELD_TYPE_SHORT;
    FIELD_TYPE_FLOAT: s := STRING_FIELD_TYPE_FLOAT;
    FIELD_TYPE_DOUBLE: s := STRING_FIELD_TYPE_DOUBLE;
    FIELD_TYPE_NULL: s := STRING_FIELD_TYPE_NULL;
    FIELD_TYPE_TIMESTAMP: s := STRING_FIELD_TYPE_TIMESTAMP;
    FIELD_TYPE_LONGLONG: s := STRING_FIELD_TYPE_LONGLONG;
    FIELD_TYPE_INT24: s := STRING_FIELD_TYPE_INT24;
    FIELD_TYPE_DATE: s := STRING_FIELD_TYPE_DATE;
    FIELD_TYPE_TIME: s := STRING_FIELD_TYPE_TIME;
    FIELD_TYPE_DATETIME: s := STRING_FIELD_TYPE_DATETIME;
    FIELD_TYPE_YEAR: s := STRING_FIELD_TYPE_YEAR;
    FIELD_TYPE_NEWDATE: s := STRING_FIELD_TYPE_NEWDATE;
    FIELD_TYPE_ENUM: s := STRING_FIELD_TYPE_ENUM;
    FIELD_TYPE_SET: s := STRING_FIELD_TYPE_SET;
    FIELD_TYPE_TINY_BLOB: s := STRING_FIELD_TYPE_TINY_BLOB;
    FIELD_TYPE_MEDIUM_BLOB: s := STRING_FIELD_TYPE_MEDIUM_BLOB;
    FIELD_TYPE_LONG_BLOB: s := STRING_FIELD_TYPE_LONG_BLOB;
    FIELD_TYPE_BLOB: s := STRING_FIELD_TYPE_BLOB;
    FIELD_TYPE_VAR_STRING: s := STRING_FIELD_TYPE_VAR_STRING;
    FIELD_TYPE_STRING: s := STRING_FIELD_TYPE_STRING;
    end;
    field_ConversionType_NomType := s;
    end;

    function TMySQLComponent.field_ConversionNomtype_Type (nom : string) : integer;
    var
    s : integer;
    begin
    if nom = STRING_FIELD_TYPE_DECIMAL then s := FIELD_TYPE_DECIMAL
    else if nom = STRING_FIELD_TYPE_TINY then s := FIELD_TYPE_TINY
    else if nom = STRING_FIELD_TYPE_SHORT then s := FIELD_TYPE_SHORT
    else if nom = STRING_FIELD_TYPE_FLOAT then s := FIELD_TYPE_FLOAT
    else if nom = STRING_FIELD_TYPE_DOUBLE then s := FIELD_TYPE_DOUBLE
    else if nom = STRING_FIELD_TYPE_NULL then s := FIELD_TYPE_NULL
    else if nom = STRING_FIELD_TYPE_TIMESTAMP then s := FIELD_TYPE_TIMESTAMP
    else if nom = STRING_FIELD_TYPE_LONGLONG then s := FIELD_TYPE_LONGLONG
    else if nom = STRING_FIELD_TYPE_INT24 then s := FIELD_TYPE_INT24
    else if nom = STRING_FIELD_TYPE_DATE then s := FIELD_TYPE_DATE
    else if nom = STRING_FIELD_TYPE_TIME then s := FIELD_TYPE_TIME
    else if nom = STRING_FIELD_TYPE_DATETIME then s := FIELD_TYPE_DATETIME
    else if nom = STRING_FIELD_TYPE_YEAR then s := FIELD_TYPE_YEAR
    else if nom = STRING_FIELD_TYPE_NEWDATE then s := FIELD_TYPE_NEWDATE
    else if nom = STRING_FIELD_TYPE_ENUM then s := FIELD_TYPE_ENUM
    else if nom = STRING_FIELD_TYPE_SET then s := FIELD_TYPE_SET
    else if nom = STRING_FIELD_TYPE_TINY_BLOB then s := FIELD_TYPE_TINY_BLOB
    else if nom = STRING_FIELD_TYPE_MEDIUM_BLOB then s := FIELD_TYPE_MEDIUM_BLOB
    else if nom = STRING_FIELD_TYPE_LONG_BLOB then s := FIELD_TYPE_LONG_BLOB
    else if nom = STRING_FIELD_TYPE_BLOB then s := FIELD_TYPE_BLOB
    else if nom = STRING_FIELD_TYPE_VAR_STRING then s := FIELD_TYPE_VAR_STRING
    else if nom = STRING_FIELD_TYPE_STRING then s := FIELD_TYPE_STRING
    else s := -1;
    field_ConversionNomtype_Type := s;
    end;

    function TMySQLComponent.table_change_name (hold_name, new_name : string) : boolean;
    var
    Row : string;
    begin
    if QueryFirstResult('SHOW tables LIKE '''+new_name+''';',Row) = false then
    begin
    Query('ALTER TABLE `'+hold_name+'` RENAME `'+new_name +'`;');
    table_change_name := true;
    end
    else table_change_name := false;
    end;

    function TMySQLComponent.create_table (name,query_table : string) : boolean;
    var
    Row : string;
    begin
    if QueryFirstResult('SHOW tables LIKE '''+name+''';',Row) = false then
    begin
    Row := '';
    Query('CREATE TABLE `'+name+'` ('+query_table+');');
    create_table := true;
    end
    else create_table := false;
    end;

    function TMySQLComponent.delete_table (name : string) : boolean;
    var
    Row : string;
    begin
    Query('DROP TABLE `'+name+'`;');
    if QueryFirstResult('SHOW tables LIKE '''+name+''';',Row) = false then
    delete_table := true
    else delete_table := false;
    end;

    function TMySQLComponent.QueryIntoTStringsUnique (Querys : string;var Strings : TStrings) : boolean;
    var
    Res : PMYSQL_RES;
    Row : PMYSQL_ROW;
    begin
    if Selected = true then
    begin
    Res := Query (Querys);
    if Res = nil then
    begin
    QueryIntoTStringsUnique := false;
    exit;
    end
    else
    try
    Strings.Clear;
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    Strings.Add(Row[0]);
    Row := mysql_fetch_row(Res);
    end;
    finally
    mysql_free_result(Res);
    end;
    QueryIntoTStringsUnique := true;
    exit;
    end;
    QueryIntoTStringsUnique := false;
    end;

    function TMySQLComponent.field_count(): longword;
    begin
    field_count := mysql_field_count(Linkp);
    end;

    procedure TMySQLComponent.ListInListBox (ListBox : TListBox;Res: PMYSQL_RES);
    var
    Row: PMYSQL_ROW;
    begin
    if Res <> nil then
    begin
    ListBox.Clear;
    if Res <> nil then
    try
    Row := mysql_fetch_row(Res);
    while Row <> nil do
    begin
    ListBox.Items.Add(Row[0]);
    Row := mysql_fetch_row(Res);
    end;
    finally
    mysql_free_result(Res);
    end;
    end;
    end;

    procedure TMySQLComponent.ListFieldsInListBox (ListBox : TListBox;Table : string);
    var
    Res: PMYSQL_RES;
    begin
    if Selected = true then
    begin
    Res := list_fields(Table,'');
    if Res <> nil then
    ListinListBox(ListBox,Res);
    end;
    end;

    function TMySQLComponent.list_fields (table, wild: string): PMYSQL_RES;
    begin
    if (wild <> '') then
    list_fields := query('SHOW COLUMNS FROM '+table+' LIKE '''+wild+''' ;')
    else
    list_fields := query('SHOW COLUMNS FROM '+table+' ;');
    end;

    procedure TMySQLComponent.ListTablesInListBox (ListBox : TListBox;Database : string);
    var
    Res: PMYSQL_RES;
    begin
    if Selected = true then
    begin
    if (Database<>'') and (Database<>Databasep) then
    begin
    Close;
    Databasep := Database;
    Connect;
    end;
    Res := list_tables('');
    if Res <> nil then
    ListinListBox(ListBox,Res);
    end;
    end;

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    1- Balise [CODE] avec le #
    2- Modifie ton sujet, et ajoute le fichier comme document joints, au lieu de trois messages ...
    3- Qui a écrit ce composant ? tu ne peux pas le contacter ?
    4- Je t'ai dit d'étudier mon extrait de code, ce que tu n'as pas pris la peine de faire,

    il semble de prime abord que "mysql_init(nil)" renvoie nil, et il faut tester avant d'appeler "mysql_connect"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 70
    Points
    70
    Par défaut Delphi7 et TMySqlComponent
    Salut,
    1. Merci pour ton aide, mai comme toi tu l'as fait, j'ai telecharger la version MyDAC7 de CoreLab et ça marche à merveille durant les 30 jours qu'il me donne.
    2. Si, j'ai passer beaucoup de temps sur l'extrait de code que tu m'as envoyé.
    3. Le code ne m'appartient pas, mais que je l'ai telecharger sur le net.
    4. Et comme je suis un débutant, j'arrive pas encore à savoir qu'elle est le problème dans un code source.
    5. Mais ce que j'ai compris durant la recherche c lors du chargement du projet, Le Composant cherche à la fois dans le repetoire Delphi, et dans le repertoire de mon telechargement, et provoque la violation d'adresse dans le repertoire de mon telecharchement.

    Encore merci

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

Discussions similaires

  1. [CR8.5][Delphi7] Choix de l'imprimante
    Par Petit vinou dans le forum SDK
    Réponses: 8
    Dernier message: 06/11/2003, 09h38
  2. Delphi7 winxp pro renvoyer un TLabel connu par nom
    Par regis1_1 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/06/2003, 11h09
  3. Réponses: 5
    Dernier message: 24/04/2003, 22h08
  4. [RAVE][DELPHI7] Comment faire un graphique ?
    Par DFANDOR dans le forum Rave
    Réponses: 7
    Dernier message: 06/02/2003, 20h25
  5. [Delphi7] Migration Delphi 6
    Par Lux interior dans le forum QuickReport
    Réponses: 2
    Dernier message: 06/12/2002, 12h05

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