要在一个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.
连接本机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