j'ai une appli à faire qui doit obligatoirement tourner en unicode, j'ai pris l'option MySQL pour la gestion de la bdb et j'utilise le wrapper suivant (fait par flype, merci à lui) ainsi que son exemple :
Code : Tout sélectionner
;- 
;- File:     libmysql.pbi
;- Version:  2.0
;- Author:   flype - flype44(at)gmail.com
;- Modified: flaith (24.07.2009)
;-
;- About:    MySQL Interface for Purebasic 4.3.
;- 
;- updated:  p-utf8 format (for unicode or ascii)
EnableExplicit
;-
;- Private - MySQL API
;-
#MYSQL_NOERROR = 0
Enumeration 0 ; client
  #CLIENT_COMPRESS
  #CLIENT_FOUND_ROWS
  #CLIENT_IGNORE_SPACE
  #CLIENT_INTERACTIVE
  #CLIENT_LOCAL_FILES
  #CLIENT_MULTI_STATEMENTS
  #CLIENT_MULTI_RESULTS
  #CLIENT_NO_SCHEMA
  #CLIENT_ODBC
  #CLIENT_SSL
EndEnumeration
Enumeration 0 ; type
  #MYSQL_TYPE_DECIMAL
  #MYSQL_TYPE_TINY
  #MYSQL_TYPE_SHORT
  #MYSQL_TYPE_LONG
  #MYSQL_TYPE_FLOAT
  #MYSQL_TYPE_DOUBLE
  #MYSQL_TYPE_NULL
  #MYSQL_TYPE_TIMESTAMP
  #MYSQL_TYPE_LONGLONG
  #MYSQL_TYPE_INT24
  #MYSQL_TYPE_DATE
  #MYSQL_TYPE_TIME
  #MYSQL_TYPE_DATETIME
  #MYSQL_TYPE_YEAR
  #MYSQL_TYPE_NEWDATE
  #MYSQL_TYPE_VARCHAR
  #MYSQL_TYPE_BIT
  #MYSQL_TYPE_NEWDECIMAL = 246
  #MYSQL_TYPE_ENUM
  #MYSQL_TYPE_SET
  #MYSQL_TYPE_TINY_BLOB
  #MYSQL_TYPE_MEDIUM_BLOB
  #MYSQL_TYPE_LONG_BLOB
  #MYSQL_TYPE_BLOB
  #MYSQL_TYPE_VAR_STRING
  #MYSQL_TYPE_STRING
  #MYSQL_TYPE_GEOMETRY
EndEnumeration
Structure MYSQL_FIELD
  name.s
  org_name.s
  table.s
  org_table.s
  db.s
  catalog.s
  def.s
  length.l
  max_length.l
  name_length.l
  org_name_length.l
  table_length.l
  org_table_length.l
  db_length.l
  catalog_length.l
  def_length.l
  flags.l
  decimals.l
  charset_nr.l
  Type.l
EndStructure
Structure MYSQL_FIELD_ARRAY
  field.MYSQL_FIELD[0]
EndStructure
Structure MYSQL_LENGTH
  *l.l[0]
EndStructure
Structure MYSQL_ROW
  *field.s[0]
EndStructure
Import "libmysql.lib" 
  mysql_affected_rows(*mysql) 
  mysql_autocommit(*mysql, *mode.Byte)
  mysql_change_user(*mysql, user.p-utf8, passwd.p-utf8, db.p-utf8) 
  mysql_character_set_name(*mysql)
  mysql_close(*mysql)
  mysql_commit(*mysql)
  mysql_data_seek(*result, offset.d)
  mysql_eof(*result)
  mysql_errno(*mysql)
  mysql_error(*mysql)
  mysql_escape_string(*strTo, strFrom.p-utf8, length.l)
  mysql_fetch_field(*result)
  mysql_fetch_field_direct(*result, fieldnr.l)
  mysql_fetch_fields(*result)
  mysql_fetch_lengths(*result)
  mysql_fetch_row(*result)
  mysql_field_count(*mysql)
  mysql_field_seek(*result, offset.l)
  mysql_field_tell(*result)
  mysql_free_result(*result)
  mysql_get_character_set_info(*mysql, *charsetinfo)
  mysql_get_client_info()
  mysql_get_client_version()
  mysql_get_host_info(*mysql)
  mysql_get_parameters()
  mysql_get_proto_info(*mysql)
  mysql_get_server_info(*mysql)
  mysql_get_server_version(*mysql)
  mysql_hex_string(strTo.p-utf8, strFrom.p-utf8, length.l)
  mysql_info(*mysql)
  mysql_init(*mysql)
  mysql_insert_id(*mysql)
  mysql_kill(*mysql, pid.l)
  mysql_list_dbs(*mysql, wild.p-utf8)
  mysql_list_fields(*mysql, table.p-utf8, wild.p-utf8)
  mysql_list_processes(*mysql)
  mysql_list_tables(*mysql, wild.p-utf8)
  mysql_master_query(*mysql, query.p-utf8, length.l)
  mysql_more_results(*mysql)
  mysql_next_result(*mysql)
  mysql_num_fields(*result)
  mysql_num_rows(*result)
  mysql_options(*mysql, option.l, arg.p-utf8)
  mysql_ping(*mysql)
  mysql_query(*mysql, query.p-utf8)
  mysql_read_query_result(*mysql)
  mysql_real_connect(*mysql, host.p-utf8, user.p-utf8, passwd.p-utf8, db.p-utf8, port.l, unix_socket.p-utf8, flags.l)
  mysql_real_escape_string(*mysql, *strTo, strFrom.p-utf8, length.l)
  mysql_real_query(*mysql, query.p-utf8, length.l)
  mysql_refresh(*mysql, Options.l)
  mysql_reload(*mysql)
  mysql_rollback(*mysql)
  mysql_row_seek(*mysql, offset.l)
  mysql_row_tell(*result)
  mysql_select_db(*mysql, db.p-utf8)
  mysql_store_result(*mysql)
EndImport
;-
;- Private - MySQL Interface
;-
Structure IMYSQL_VTABLE
  
  *host
  *proto
  *client_long
  *client_string
  *server_long
  *server_string
  
  *affected_rows
  *error
  *escape_string
  
  *field
  *field_length
  *field_length_max
  *field_name
  *field_reset
  *field_type
  *field_type_string
  
  *free
  
  *GetDate 
  *GetDateTime 
  *GetDouble 
  *GetFloat 
  *GetLong 
  *GetQuad 
  *GetString 
  *GetTime 
  
  *get_date
  *get_date_string
  *get_datetime
  *get_datetime_string
  *get_double
  *get_float
  *get_long
  *get_quad
  *get_string
  *get_time
  *get_time_string
  
  *info
  *insert_id
  
  *num_fields
  *num_rows
  
  *ping
  
  *query
  *query_from_file
  *query_xml
  *query_xml_from_file
  
  *row
  *selectdb
  
  *update
  *update_from_file
  ;added 24/07/09
  *autocommit
  *commit
EndStructure
Structure SMYSQL
  *vt.IMYSQL_VTABLE
  *link
  *result
  *row.MYSQL_ROW
  *field.MYSQL_FIELD
EndStructure
Interface IMYSQL
  
  host.s()
  proto.l()
  client_long.l()
  client_string.s()
  server_long.l()
  server_string.s()
  
  affected_rows.l()
  error.s()
  escape_string.s(string.s)
  field.l()
  field_length.l()
  field_length_max.l()
  field_name.s()
  field_reset.l()
  field_type.l()
  field_type_string.s()
  free.l()
  GetDate.l(name.s)
  GetDateTime.l(name.s)
  GetDouble.d(name.s)
  GetFloat.f(name.s)
  GetLong.l(name.s)
  GetQuad.q(name.s)
  GetString.s(name.s)
  GetTime.l(name.s)
  get_date.l(column.l = 0)
  get_date_string.s(column.l = 0)
  get_datetime.l(column.l = 0)
  get_datetime_string.s(column.l = 0)
  get_double.d(column.l = 0)
  get_float.f(column.l = 0)
  get_long.l(column.l = 0)
  get_quad.q(column.l = 0)
  get_string.s(column.l = 0)
  get_time.l(column.l = 0)
  get_time_string.s(column.l = 0)
  info.s()
  insert_id.l()
  num_fields.l()
  num_rows.l()
  ping.l()
  query.l(query.s)
  query_from_file.l(fileIn.s)
  query_xml(query.s, fileOut.s, table.l = #False, db.l = #False)
  query_xml_from_file(fileIn.s, fileOut.s, table.l = #False, db.l = #False)
  row.l()
  selectdb.l(database.s)
  update.l(query.s)
  update_from_file.l(fileIn.s)
  ;added 24/07/09
  autocommit(mode.l = #True)
  commit.l()
EndInterface
Procedure.s PeekS_Utf8(*buffer)       ;also checks if buffer is valid, returns an empty string if *buffer is 0
  If *buffer
    ProcedureReturn PeekS(*buffer, -1, #PB_UTF8)
  Else
    ProcedureReturn ""
  EndIf
EndProcedure 
Procedure.s mysql_name_string(*field.MYSQL_FIELD, db.l, table.l)
  
  Protected result.s
  
  If db
    result + *field\db + "."
  EndIf
  
  If table
    result + *field\table + "."
  EndIf
  
  ProcedureReturn result + *field\name
  
EndProcedure
Procedure.s mysql_type_string(Type.l)
  
  Select Type
    Case #MYSQL_TYPE_DECIMAL:     ProcedureReturn "decimal"
    Case #MYSQL_TYPE_TINY:        ProcedureReturn "tiny"
    Case #MYSQL_TYPE_SHORT:       ProcedureReturn "short"
    Case #MYSQL_TYPE_LONG:        ProcedureReturn "long"
    Case #MYSQL_TYPE_FLOAT:       ProcedureReturn "float"
    Case #MYSQL_TYPE_DOUBLE:      ProcedureReturn "double"
    Case #MYSQL_TYPE_NULL:        ProcedureReturn "null"
    Case #MYSQL_TYPE_TIMESTAMP:   ProcedureReturn "timestamp"
    Case #MYSQL_TYPE_LONGLONG:    ProcedureReturn "longlong"
    Case #MYSQL_TYPE_INT24:       ProcedureReturn "int24"
    Case #MYSQL_TYPE_DATE:        ProcedureReturn "date"
    Case #MYSQL_TYPE_TIME:        ProcedureReturn "time"
    Case #MYSQL_TYPE_DATETIME:    ProcedureReturn "datetime"
    Case #MYSQL_TYPE_YEAR:        ProcedureReturn "year"
    Case #MYSQL_TYPE_NEWDATE:     ProcedureReturn "newdate"
    Case #MYSQL_TYPE_VARCHAR:     ProcedureReturn "varchar"
    Case #MYSQL_TYPE_BIT:         ProcedureReturn "bit"
    Case #MYSQL_TYPE_NEWDECIMAL:  ProcedureReturn "newdecimal"
    Case #MYSQL_TYPE_ENUM:        ProcedureReturn "enum"
    Case #MYSQL_TYPE_SET:         ProcedureReturn "set"
    Case #MYSQL_TYPE_TINY_BLOB:   ProcedureReturn "tinyblob"
    Case #MYSQL_TYPE_MEDIUM_BLOB: ProcedureReturn "mediumblob"
    Case #MYSQL_TYPE_LONG_BLOB:   ProcedureReturn "longblob"
    Case #MYSQL_TYPE_BLOB:        ProcedureReturn "blob"
    Case #MYSQL_TYPE_VAR_STRING:  ProcedureReturn "varstring"
    Case #MYSQL_TYPE_STRING:      ProcedureReturn "string"
    Case #MYSQL_TYPE_GEOMETRY:    ProcedureReturn "geometry"
  EndSelect
  
  ProcedureReturn "unknown"
  
EndProcedure
Procedure.l db_affected_rows(*this.SMYSQL)
  
  If *this And *this\link 
    mysql_affected_rows(*this\link) 
  EndIf
  
EndProcedure
Procedure.s db_error(*this.SMYSQL)
  
  If *this And *this\link
    
    If mysql_error(*this\link)
      ;ProcedureReturn PeekS(mysql_error(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_error(*this\link))
    EndIf
    
  EndIf
  
EndProcedure
Procedure.s db_escape_string(*this.SMYSQL, string.s)
  
  Protected result.s
  
  If *this And *this\link 
    
    result = Space((Len(string) + 2) * 2)
    result = ReplaceString(Left(result, mysql_real_escape_string(*this\link, @result, string, Len(string))), #TAB$, "\t")
    
    ProcedureReturn result
    
  EndIf
  
EndProcedure
Procedure.l db_field(*this.SMYSQL)
  
  If *this And *this\result
    
    *this\field = mysql_fetch_field(*this\result)
    
    ProcedureReturn *this\field
    
  EndIf
  
EndProcedure
Procedure.l db_field_length(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\length
  EndIf
  
EndProcedure
Procedure.l db_field_length_max(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\max_length
  EndIf
  
EndProcedure
Procedure.s db_field_name(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\name
  EndIf
  
EndProcedure
Procedure.l db_field_reset(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_field_seek(*this\result, 0)
  EndIf
  
EndProcedure
Procedure.l db_field_type(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn *this\field\type
  EndIf
  
EndProcedure
Procedure.s db_field_type_string(*this.SMYSQL)
  
  If *this And *this\field
    ProcedureReturn mysql_type_string(*this\field\type)
  EndIf
  
EndProcedure
Procedure.l db_free(*mysql.SMYSQL)
  
  If *mysql
    
    If *mysql\result
      mysql_free_result(*mysql\result)
    EndIf
    
    If *mysql\link
      mysql_close(*mysql\link) 
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetDate(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%yyyy-%mm-%dd", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetDateTime(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.d db_GetDouble(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ValD(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.f db_GetFloat(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ValF(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetLong(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn Val(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.q db_GetQuad(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ;ProcedureReturn ValQ(*this\row\field[i])
          ProcedureReturn Val(*this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.s db_GetString(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0)
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn *this\row\field[i]
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_GetTime(*this.SMYSQL, name.s)
  
  Protected *field.MYSQL_FIELD, nFields.l, i.l
  
  If *this\result And *this\row
    
    nFields = mysql_num_fields(*this\result)
    
    If nFields
      
      mysql_field_seek(*this\result, 0) 
      
      For i = 0 To nFields - 1
        
        *field = mysql_fetch_field(*this\result)
        
        If *field\name = name
          ProcedureReturn ParseDate("%hh:%ii:%ss", *this\row\field[i])
        EndIf
        
      Next
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_get_date(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%yyyy-%mm-%dd", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_date_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    Protected date.l = ParseDate("%yyyy-%mm-%dd", *this\row\field[column])
    If date <> -1
      ProcedureReturn FormatDate("%dd-%mm-%yyyy", date)
    EndIf
  EndIf
  
EndProcedure
Procedure.l db_get_datetime(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_datetime_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    Protected datetime.l = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", *this\row\field[column])
    If datetime <> -1
      ProcedureReturn FormatDate("%dd-%mm-%yyyy %hh:%ii:%ss", datetime)
    EndIf
  EndIf
  
EndProcedure
Procedure.d db_get_double(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ValD(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.f db_get_float(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ValF(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.l db_get_long(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn Val(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.q db_get_quad(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ;ProcedureReturn ValQ(*this\row\field[column])
    ProcedureReturn Val(*this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn *this\row\field[column]
  EndIf
  
EndProcedure
Procedure.l db_get_time(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn ParseDate("%hh:%ii:%ss", *this\row\field[column])
  EndIf
  
EndProcedure
Procedure.s db_get_time_string(*this.SMYSQL, column.l = 0)
  
  If *this And *this\row 
    ProcedureReturn *this\row\field[column]
  EndIf
  
EndProcedure
Procedure.s db_info(*this.SMYSQL)
  
  If *this And *this\link 
    
    If mysql_info(*this\link) 
      ;ProcedureReturn PeekS(mysql_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_info(*this\link))
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_insert_id(*this.SMYSQL)
  
  If *this And *this\link 
    mysql_insert_id(*this\link) 
  EndIf
  
EndProcedure
Procedure.l db_num_fields(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_num_fields(*this\result)
  EndIf
  
EndProcedure
Procedure.l db_num_rows(*this.SMYSQL)
  
  If *this And *this\result
    ProcedureReturn mysql_num_rows(*this\result)
  EndIf
  
EndProcedure
Procedure.l db_ping(*this.SMYSQL)
  
  If *this And *this\link
    
    If mysql_ping(*this\link) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_query(*this.SMYSQL, query.s)
  
  If *this And *this\link
    
    If *this\result
      mysql_free_result(*this\result)
    EndIf
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
    ;If mysql_query(*this\link, query) = #MYSQL_NOERROR
      
      *this\result = mysql_store_result(*this\link)
      If *this\result
        ProcedureReturn #True
      EndIf
      
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_query_from_file(*this.SMYSQL, fileIn.s)
  
  Protected result.l, file.l, query.s
  
  If *this And *this\link
    
    If *this\result
      mysql_free_result(*this\result)
    EndIf
    
    file = ReadFile(#PB_Any, fileIn)
    
    If file
      
      query = Space(Lof(file))
      
      If ReadData(file, @query, Lof(file)) = Lof(file)
        
        If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
          
          *this\result = mysql_store_result(*this\link)
          
          If *this\result
            result = #True
          EndIf
          
        EndIf
        
      EndIf
      
      CloseFile(file)
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l db_query_xml(*this.SMYSQL, query.s, fileOut.s, table.l = #False, db.l = #False)
  
  Protected file.l, result.l, *result
  Protected i.l, num_rows.l, *row.MYSQL_ROW
  Protected j.l, num_fields.l, *field.MYSQL_FIELD
  
  If *this And *this\link
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
      
      *result = mysql_store_result(*this\link)
      
      If *result
        
        file = CreateFile(#PB_Any, fileOut)
        
        If file
          
          num_rows   = mysql_num_rows(*result)
          num_fields = mysql_num_fields(*result)
          
          WriteStringN(file, "<?xml version='1.0' ?>")
          WriteStringN(file, "<mysql>")
          WriteStringN(file, "  <date>" + FormatDate("%yyyy-%mm-%dd %hh:%ii:%ss", Date()) + "</date>")
          WriteStringN(file, "  <query>" + db_escape_string(*this, query) + "</query>")
          WriteStringN(file, "  <fields count='" + Str(num_fields) + "'>")
          
          For j = 0 To num_fields - 1
            *field = mysql_fetch_field(*result)
            WriteStringN(file, "    <field id='" + Str(j+1) + "' type='"   + mysql_type_string(*field\Type) + "' length='" + Str(*field\length) + "' name='" + mysql_name_string(*field, db, table) + " />")
          Next j
          
          WriteStringN(file, "  </fields>")
          WriteStringN(file, "  <rows count='" + Str(num_rows) + "'>")
          
          For i = 0 To num_rows - 1
            
            mysql_field_seek(*result, 0)
            *row = mysql_fetch_row(*result)
            WriteStringN(file, "    <row id='" + Str(i+1) + "'>")
            
            For j = 0 To num_fields - 1
              *field = mysql_fetch_field(*result)
              WriteString (file, "      <" + mysql_name_string(*field, db, table) + ">")
              WriteString (file, db_escape_string(*this, *row\field[j]))
              WriteStringN(file, "</" + mysql_name_string(*field, db, table) + ">")
            Next j
            
            WriteStringN(file, "    </row>")
            
          Next i
          
          WriteStringN(file, "  </rows>")
          WriteStringN(file, "</mysql>")
          CloseFile(file)
          result = #True
          
        EndIf
        
        mysql_free_result(*result)
        
      EndIf
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.l db_query_xml_from_file(*this.SMYSQL, fileIn.s, fileOut.s, table.l = #False, db.l = #False)
  
  ;**** to do
  
EndProcedure
Procedure.l db_row(*this.SMYSQL)
  
  If *this And *this\result
    
    *this\row = mysql_fetch_row(*this\result)
    
    ProcedureReturn *this\row
    
  EndIf
  
EndProcedure
Procedure.l db_selectdb(*this.SMYSQL, database.s)
  
  If *this And *this\link And (mysql_select_db(*this\link, database) = #MYSQL_NOERROR)
    ProcedureReturn #True
  EndIf
  
EndProcedure
Procedure.l db_update(*this.SMYSQL, query.s)
  
  If *this And *this\link
    
    If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
  
EndProcedure
Procedure.l db_update_from_file(*this.SMYSQL, fileIn.s)
  
  Protected result.l, file.l, query.s
  
  If *this And *this\link
    
    file = ReadFile(#PB_Any, fileIn)
    
    If file
      
      query = Space(Lof(file))
      
      If ReadData(file, @query, Lof(file)) = Lof(file)
        If mysql_real_query(*this\link, query, Len(query)) = #MYSQL_NOERROR
          result = #True
        EndIf
      EndIf
      
      CloseFile(file)
      
    EndIf
    
  EndIf
  
  ProcedureReturn result
  
EndProcedure
Procedure.s db_host(*this.SMYSQL)
  
  If *this And *this\link
    If mysql_get_host_info(*this\link)
      ;ProcedureReturn PeekS(mysql_get_host_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_get_host_info(*this\link))
    EndIf
  EndIf
  
EndProcedure
Procedure.l db_proto(*this.SMYSQL)
  
  If *this And *this\link
    ProcedureReturn mysql_get_proto_info(*this\link)
  EndIf
  
EndProcedure
Procedure.l db_client_long(*this.SMYSQL)
  
  If *this
    ProcedureReturn mysql_get_client_version()
  EndIf
  
EndProcedure
Procedure.s db_client_string(*this.SMYSQL)
  
  If *this And mysql_get_client_info()
    ;ProcedureReturn PeekS(mysql_get_client_info())
    ProcedureReturn PeekS_Utf8(mysql_get_client_info())
  EndIf
  
EndProcedure
Procedure.l db_server_long(*this.SMYSQL)
  
  If *this And *this\link
    ProcedureReturn mysql_get_server_version(*this\link)
  EndIf
  
EndProcedure
Procedure.s db_server_string(*this.SMYSQL)
  
  If *this And *this\link
    If mysql_get_server_info(*this\link)
      ;ProcedureReturn PeekS(mysql_get_server_info(*this\link))
      ProcedureReturn PeekS_Utf8(mysql_get_server_info(*this\link))
    EndIf
  EndIf
  
EndProcedure
; added 24/07/09
Procedure.l db_autocommit(*this.SMYSQL, mode.l)
  If *this And *this\link
    
    If mysql_autocommit(*this\link, mode) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
EndProcedure
Procedure.l db_commit(*this.SMYSQL)
  If *this And *this\link
    
    If mysql_commit(*this\link) = #MYSQL_NOERROR
      ProcedureReturn #True
    EndIf
    
  EndIf
EndProcedure
;-
;- Public - MySQL Interface
;-
ProcedureDLL.l mysql(host.s = "localhost", user.s = "root", pwd.s = "", db.s = "", port.l = 3306, flags.l = #Null)
  
  Protected *this.SMYSQL = AllocateMemory(SizeOf(SMYSQL))
  
  If *this
    
    *this\vt = AllocateMemory(SizeOf(IMYSQL_VTABLE))
    
    If *this\vt
      
      *this\link = mysql_init(#Null)
      
      If *this\link
        
        If mysql_real_connect(*this\link, host, user, pwd, db, port, "NULL", flags) = *this\link
          
          *this\vt\host                = @db_host() 
          *this\vt\proto               = @db_proto() 
          *this\vt\client_long         = @db_client_long() 
          *this\vt\client_string       = @db_client_string() 
          *this\vt\server_long         = @db_server_long() 
          *this\vt\server_string       = @db_server_string() 
          
          *this\vt\affected_rows       = @db_affected_rows() 
          *this\vt\error               = @db_error() 
          *this\vt\escape_string       = @db_escape_string() 
          *this\vt\field               = @db_field() 
          *this\vt\field_length        = @db_field_length() 
          *this\vt\field_length_max    = @db_field_length_max() 
          *this\vt\field_name          = @db_field_name() 
          *this\vt\field_reset         = @db_field_reset() 
          *this\vt\field_type          = @db_field_type() 
          *this\vt\field_type_string   = @db_field_type_string() 
          *this\vt\free                = @db_free() 
          *this\vt\GetDate             = @db_GetDate()
          *this\vt\GetDateTime         = @db_GetDateTime()
          *this\vt\GetDouble           = @db_GetDouble()
          *this\vt\GetFloat            = @db_GetFloat()
          *this\vt\GetLong             = @db_GetLong()
          *this\vt\GetQuad             = @db_GetQuad()
          *this\vt\GetString           = @db_GetString()
          *this\vt\GetTime             = @db_GetTime()
          *this\vt\get_date            = @db_get_date() 
          *this\vt\get_date_string     = @db_get_date_string() 
          *this\vt\get_datetime        = @db_get_datetime() 
          *this\vt\get_datetime_string = @db_get_datetime_string() 
          *this\vt\get_double          = @db_get_double() 
          *this\vt\get_float           = @db_get_float() 
          *this\vt\get_long            = @db_get_long() 
          *this\vt\get_quad            = @db_get_quad() 
          *this\vt\get_string          = @db_get_string() 
          *this\vt\get_time            = @db_get_time()
          *this\vt\get_time_string     = @db_get_time_string()
          *this\vt\info                = @db_info() 
          *this\vt\insert_id           = @db_insert_id() 
          *this\vt\num_fields          = @db_num_fields() 
          *this\vt\num_rows            = @db_num_rows() 
          *this\vt\ping                = @db_ping() 
          *this\vt\query               = @db_query() 
          *this\vt\query_from_file     = @db_query_from_file() 
          *this\vt\query_xml           = @db_query_xml() 
          *this\vt\query_xml_from_file = @db_query_xml_from_file() 
          *this\vt\row                 = @db_row() 
          *this\vt\selectdb            = @db_selectdb() 
          *this\vt\update              = @db_update() 
          *this\vt\update_from_file    = @db_update_from_file() 
          *this\vt\autocommit          = @db_autocommit()
          *this\vt\commit              = @db_commit()
          ProcedureReturn *this
          
        EndIf
        
        mysql_close(*this\link) : *this\link = #Null
        
      EndIf
      
      FreeMemory(*this\vt) : *this\vt = #Null
      
    EndIf
    
    FreeMemory(*this) : *this = #Null
    
  EndIf
  
EndProcedure
ProcedureDLL.l mysql_from_ini()
  
  OpenPreferences("libmysql.ini")
  
  PreferenceGroup("CONNECTION")
  
  Protected db_host.s = ReadPreferenceString("host", "localhost")
  Protected db_user.s = ReadPreferenceString("user", "root")
  Protected db_pass.s = ReadPreferenceString("pass", #NULL$)
  Protected db_base.s = ReadPreferenceString("base", #NULL$)
  Protected db_port.l = ReadPreferenceLong  ("port", 3306)
  Protected db_opts.l = ReadPreferenceLong  ("opts", #Null)
  
  ClosePreferences()
  
  ProcedureReturn mysql(db_host, db_user, db_pass, db_base, db_port, db_opts)
  
EndProcedure
DisableExplicit
;- 
;- End Of File
;- 
Code : Tout sélectionner
IncludePath #PB_Compiler_Home + "Includes\"
XIncludeFile "libmysql_utf8.pbi"      ;Unicode ou ascii
db.IMYSQL = mysql("localhost","hotline", "", "mysql")
If db
 
  If db\query("SELECT 'Hello' AS 'f1', 'World !' AS 'f2', NOW() as 'f3', 12345.6789")
   
    While db\row()
     
      Debug db\GetString("f1")
      Debug db\GetString("f2")
     
      Debug FormatDate("%dd.%mm.%yyyy", db\GetDate("f3"))
     
      Debug db\get_double(3)
     
    Wend
   
  Else
   
    Debug db\error()
   
  EndIf
 
  db\free()
 
EndIf