• Delphi连接MySql(待测试验证,使用mysql.pas未通过)


    要在一个Delphi程序中调用Mysql数据库,查到有个资料如下,待验证,验证后会给出结果。暂时做个标记

    已经验证,验证日期:2018.6.18

    验证结果:不可行

    验证工具:XE7,mysql5.5.51

    报错:mysql_connect函数可能已经失效。找不到更新的mysql.pas


    用libmySQL.dll(来自于Mysql安装后的文件)
    和MySql.pas

    以下是mysql.pas

    // -----------------------------------------------------------------------------------------------
    //
    //                    MySQL Client API for Borland Delphi (version 4 and above)
    //
    //                           Pascal Interface Unit for libmySQL.dll, the
    //                        Client Library for MySQL AB's SQL Database Server
    //
    //                  This is a literal translation of relevant parts of MySQL AB's
    //                    C header files, mysql.h, mysql_com.h, and mysql_version.h
    //
    //                            Copyright (c) 1999-2002 Matthias Fichtner
    //                           (see license.txt for licensing information)
    //
    // -----------------------------------------------------------------------------------------------
    //                       See mysql.h for MySQL AB's copyright and GPL notice
    // -----------------------------------------------------------------------------------------------
    //
    //       17-Aug-1999  mf  Translated mysql.h                             MySQL 3.22.24
    //       19-Aug-1999  mf  Corrected some type definitions                MySQL 3.22.24
    //       20-Aug-1999  mf  Finished debugging the unit                    MySQL 3.22.24
    //       18-Sep-1999  mf  Code maintenance for release 3.22.26a          MySQL 3.22.26a
    //       22-Oct-1999  mf  Code maintenance for release 3.22.28           MySQL 3.22.28
    //       02-Jan-2000  mf  Code maintenance for release 3.22.29           MySQL 3.22.29
    //       21-Jan-2000  mf  Code maintenance for release 3.22.30           MySQL 3.22.30
    //       07-Feb-2000  mf  Code maintenance for release 3.22.31           MySQL 3.22.31
    //       16-Feb-2000  mf  Code maintenance for release 3.22.32           MySQL 3.22.32
    //       13-Aug-2000  mf  Code maintenance for release 3.22.34           MySQL 3.22.34
    //       14-Aug-2000  mf  Reworked entire unit for first 3.23 release    MySQL 3.23.19-beta
    //       14-Aug-2000  mf  Added mysql_character_set_name()               MySQL 3.23.22-beta
    //       11-Sep-2000  mf  Added IS_NUM_FIELD and INTERNAL_NUM_FIELD      MySQL 3.23.24-beta
    //       08-Oct-2000  mf  Modified TMEM_ROOT, enum_server_command,       MySQL 3.23.25-beta
    //                        and INTERNAL_NUM_FIELD
    //       01-Nov-2000  mf  Code maintenance for release 3.23.27           MySQL 3.23.27-beta
    //       25-Nov-2000  mf  Code maintenance for release 3.23.28           MySQL 3.23.28-gamma
    //       05-Jan-2001  mf  Code maintenance for release 3.23.30           MySQL 3.23.30-gamma
    //       19-Jan-2001  mf  Code maintenance for release 3.23.31           MySQL 3.23.31
    //       11-Mar-2001  mf  Added functions mysql_real_send_query(),       MySQL 3.23.33
    //                        mysql_send_query(), and mysql_reap_query()
    //       28-Mai-2001  mf  Modified mysql_send_query(), removed           MySQL 3.23.38
    //                        mysql_real_send_query(), mysql_reap_query(),
    //                        added mysql_read_query_result(), and fixed
    //                        CLIENT_TRANSACTIONS
    //       07-Aug-2001  mf  Code maintenance for release 3.23.40           MySQL 3.23.40
    //       23-Sep-2001  mf  Code maintenance for release 3.23.42           MySQL 3.23.42
    //       29-Jan-2002  mf  Added libmysql_load(), libmysql_free(),        MySQL 3.23.47
    //                        libmysql_status and LIBMYSQL_ constants
    //                        for dynamic loading of libmySQL.dll
    //       11-Mar-2002  mf  Added MYSQL_OPT_LOCAL_INFILE to mysql_option   MySQL 3.23.49
    //
    // -----------------------------------------------------------------------------------------------
    //
    //                   Latest releases of mysql.pas are made available through the
    //                   distribution site at: http://www.fichtner.net/delphi/mysql/
    //
    //                  Please send questions, bug reports, and suggestions regarding
    //                  mysql.pas to Matthias Fichtner <mfichtner@fichtner-meyer.com>
    //
    //                      See readme.txt for an introduction and documentation.
    //                    See license.txt for licensing information and disclaimer.
    //
    // -----------------------------------------------------------------------------------------------
    //                     This unit is provided "as is". Use it at your own risk.
    // -----------------------------------------------------------------------------------------------
    
    unit mysql;
    
    // -----------------------------------------------------------------------------------------------
    INTERFACE
    // -----------------------------------------------------------------------------------------------
    
    uses
      Windows,  // Needed for some type definitions
      Winsock;  // Needed for some type definitions
    
    // ----------------
    // 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 ...
    // ----------------
    
    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;
    
    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;
    
    function IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    function INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    
    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;
    
    // Functions to get information from the MYSQL and MYSQL_RES structures
    // Should definitely be used if one uses shared libraries
    
    var
      mysql_num_rows: function(res: PMYSQL_RES): my_ulonglong; stdcall;
      mysql_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;
      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;
    
    var
      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;
    
    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;
    
    var
      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;
      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;
      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;
    
    function mysql_reload(_mysql: PMySQL): longint;
    
    // 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 libmysql_load(name: pChar): byte;
    procedure libmysql_free;
    
    // -----------------------------------------------------------------------------------------------
    IMPLEMENTATION
    // -----------------------------------------------------------------------------------------------
    
    function IS_PRI_KEY(n: longword): boolean;
    begin
      Result := (n and PRI_KEY_FLAG) = PRI_KEY_FLAG;
    end;
    
    function IS_NOT_NULL(n: longword): boolean;
    begin
      Result := (n and NOT_NULL_FLAG) = NOT_NULL_FLAG;
    end;
    
    function IS_BLOB(n: longword): boolean;
    begin
      Result := (n and BLOB_FLAG) = BLOB_FLAG;
    end;
    
    function IS_NUM(t: longword): boolean;
    begin
      Result := (t <= FIELD_TYPE_INT24) or (t = FIELD_TYPE_YEAR);
    end;
    
    function IS_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
      Result := (f.flags and NUM_FLAG) = NUM_FLAG;
    end;
    
    function INTERNAL_NUM_FIELD(f: PMYSQL_FIELD): boolean;
    begin
      Result := (((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 mysql_reload(_mysql: PMYSQL): longint;
    begin
      Result := mysql_refresh(_mysql, REFRESH_GRANT);
    end;
    
    function libmysql_load(name: pChar): byte;
    
      procedure assign_proc(var proc: FARPROC; name: pChar);
      begin
        proc := GetProcAddress(libmysql_handle, name);
        if proc = nil then libmysql_status := LIBMYSQL_INCOMPATIBLE;
      end;
    
    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(@mysql_num_fields, 'mysql_num_fields');
        assign_proc(@mysql_eof, 'mysql_eof');
        assign_proc(@mysql_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(@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(@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;
      Result := libmysql_status;
    end;
    
    procedure libmysql_free;
    begin
      if libmysql_handle <> 0 then FreeLibrary(libmysql_handle);
      libmysql_handle := 0;
      libmysql_status := LIBMYSQL_UNDEFINED;
    end;
    
    // -----------------------------------------------------------------------------------------------
    INITIALIZATION
    // -----------------------------------------------------------------------------------------------
    
    begin
      {$IFNDEF DONT_LOAD_DLL}
      libmysql_load(nil);
      {$ENDIF} // DONT_LOAD_DLL
    end;
    
    // -----------------------------------------------------------------------------------------------
    FINALIZATION
    // -----------------------------------------------------------------------------------------------
    
    begin
      libmysql_free;
    end;
    
    end.
    View Code

    连接本机mysql的例子:

    // uses mysql;   //当前目录要有libmySQL.dll,当然,放在系统目录也可以,这个文件在mysql安装目录里有
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Row: PMYSQL_ROW;
      MResult: PMYSQL_RES;
      dbh:PMYSQL;
      tables:string;
    begin
      dbh := mysql_init(nil);
      if dbh=nil then    begin  showmessage('初始化MySQL对象失败。');  exit;   end;
      if nil=mysql_connect(dbh,'localhost','root','') then
      begin
        Memo1.lines.Add(mysql_error(dbh));  exit;
      end;
      if 0<>mysql_select_db(dbh,'chemdbs') then
      begin
        Memo1.Lines.Add(mysql_error(dbh));
        mysql_close(dbh);  exit;
      end;
      tables:='maildb';
      mysql_query(dbh,PChar('select id,dw,em,lxr,flg from '+tables+' where flg=0 limit 0,30000'));
      MResult := mysql_use_result(dbh);
      EMList.Clear;
      Ems.Clear; Sta.Clear;
      repeat
        Row := mysql_fetch_row(MResult);
        if Row<>nil then begin
          Ems.Add(Row[2] + ',' + Row[1] + ',' + Row[3]);
          Sta.Add('1');
          EMList.Items.Add.Caption :='';
        end;
      until Row=nil;
      mysql_free_result(MResult);
      mysql_close(dbh);
      Logs.Lines.Add(inttostr(Ems.Count) + 'Record Read'); 
    end; 

    1、基于安全考虑,很多mysql服务器只允许本机连接,检查你的linux上的mysql是否允许外部连接。
    2、程序中只要mysql_connect(dbh,'localhost','root','') 后面3个参数正确就可以,主机地址、用户名、密码。即可连接到其它服务器上的MySQL
    3、移动数据只要把mysql安装目录下的data目录下的某个目录移走,一个目录是一个数据库。

    libmysql.dll 版本是:3.23.49
    mysql.pas 版本是3.23.49
    后台mysql服务器版本是3.23.47 for win2000及3.23.42 for sco openserver 5.0.6
    经测试:运行正确,非常好.

    把ado,bde,odbc扔到垃圾堆去吧.

     参考:https://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html

  • 相关阅读:
    解决问题通用方法论
    Flutter 即学即用系列博客总结篇
    Android Q 兼容那些事
    Android 截屏的各种骚操作
    MTLTexture转成UIimage
    swift使用metal加载三角形、平面图片、立体图像
    GPUImage2的使用
    Swift OpenGL ES 自定义常用滤镜(二)
    Swift OpenGL ES 自定义常用滤镜(一)
    Core Image简介与使用
  • 原文地址:https://www.cnblogs.com/mobilecard/p/9193076.html
Copyright © 2020-2023  润新知