最新IBM水货笔记本价格,详细点击进入

查看完整版本: .NET如何访问MySQL数据库

风舞残阳 2008-4-2 13:44

.NET如何访问MySQL数据库

  .NET的[wiki]数据库[/wiki]天然支持MSSQLServer,但是并非其他数据库不支持,而是[wiki]微软[/wiki]基于自身利益需要,在支持、营销上推自己的数据库产品;但是作为平台战略,他并非排斥其他数据库,而是参考java体系提出了一套数据库访问规范,让各个第三方进行开发,提供特定的驱动。
  MySQL是免费的数据库,在[wiki]成本[/wiki]上具有无可替代的优势,但是目前来讲,并没有提供。微软把MySQL当作ODBC数据库,可以按照ODBC.Net规范进行访问,具体参考
  http://www.microsoft.com/china/community/Columns/Luyan/6.mspx
  而实际上,针对ODBC。Net的需要配置DSN的麻烦,而是出现了一个[wiki]开源[/wiki]的[wiki]系统[/wiki]MySQLDriverCS,对MySQL的开发进行了封装,实现了.net[wiki]环境[/wiki]下对于MySQL数据库系统的访问。
  http://sourceforge.net/projects/mysqldrivercs/
  通过阅读[wiki]源代码[/wiki],我们看到MySQLDriverCS的思路是利用C函数的底层库来操纵数据库的,通常提供对MySQL数据库的访问的数据库的CDLL是名为libmySQL.dll的驱动文件,MySQLDriverCS作为一个.net库进行封装C风格的驱动。
  具体如何进行呢?
  打开工程后,我们看到其中有一个比较特殊的.cs文件CProto[wiki]type[/wiki]s.cs:
以下是引用片段:
  #regionLICENSE
  /*
  MySQLDriverCS:AnC#driverforMySQL.
  Copyright(c)2002ManuelLucasVi馻sLivschitz.
  ThisfileispartofMySQLDriverCS.
  MySQLDriverCSisfreesoftware;youcanredistributeitand/ormodify
  itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby
  theFreeSoftwareFoundation;eitherversion2oftheLicense,or
  (atyouroption)anylaterversion.
  MySQLDriverCSisdistributedinthehopethatitwillbeuseful,
  butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
  MERCHANTABILITYorFITNESSFORAPARTICULARPUR[wiki]POS[/wiki]E.Seethe
  GNUGeneralPublicLicenseformoredetails.
  YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense
  alongwithMySQLDriverCS;ifnot,writetotheFreeSoftware
  Foundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USA
  */
  #endregion
  usingSystem;
  usingSystem.Data;
  usingSystem.Runtime.InteropServices;
  namespaceMySQLDriverCS
  {
  //[StructLayout(LayoutKind.Sequential)]
  publicclassMYSQL_FIELD_FACTORY
  {
  staticstringversion;
  publicstaticIMYSQL_FIELDGetInstance()
  {
  if(version==null)
  {
  version=CPrototypes.GetClientInfo();
  }
  if(version.CompareTo("4.1.2-alpha")%26gt;=0)
  {
  returnnewMYSQL_FIELD_VERSION_5();
  }
    else
  returnnewMYSQL_FIELD_VERSION_3();
  }
  }
  publicinterfaceIMYSQL_FIELD
  {
  stringName{get;}
  uintType{get;}
  longMax_Length  {get;}
  }
  ///%26lt;summary%26gt;
  ///Fielddescriptor
  ///%26lt;/summary%26gt;
  [StructLayout(LayoutKind.Sequential)]//"3.23.32",4.0.1-alpha
  internalclassMYSQL_FIELD_VERSION_3:IMYSQL_FIELD
  {
  ///%26lt;summary%26gt;
  ///Nameofcolumn
  ///%26lt;/summary%26gt;
  publicstringname;     
  ///%26lt;summary%26gt;
  ///Tableofcolumnifcolumnwasafield
  ///%26lt;/summary%26gt;
  publicstringtable;    
    //publicstringorg_table;       /*Orgtablenameiftablewasanalias*/
    //publicstringdb;      /*Databasefortable*/
  ///%26lt;summary%26gt;
  ///def
  ///%26lt;/summary%26gt;
  publicstringdef;     
  ///%26lt;summary%26gt;
  ///length
  ///%26lt;/summary%26gt;
  publiclonglength;   
  ///%26lt;summary%26gt;
  ///max_length
  ///%26lt;/summary%26gt;
  publiclongmax_length;  
  ///%26lt;summary%26gt;
  ///Divflags
  ///%26lt;/summary%26gt;
  publicuintflags;    
  ///%26lt;summary%26gt;
  ///Numberofdecimalsinfield
  ///%26lt;/summary%26gt;
  publicuintdecimals;   
  ///%26lt;summary%26gt;
  ///Typeoffield.Semysql_com.hfortypes
  ///%26lt;/summary%26gt;
  publicuinttype;
  ///%26lt;summary%26gt;
  ///Name
  ///%26lt;/summary%26gt;
  publicstringName
  {
    get{returnname;}
  }
  ///%26lt;summary%26gt;
  ///Type
  ///%26lt;/summary%26gt;
  publicuintType
  {
    get{returntype;}
  }
  ///%26lt;summary%26gt;
  ///Max_Length
  ///%26lt;/summary%26gt;
  publiclongMax_Length
  {
    get  {returnmax_length;}
  }
  }
  ///%26lt;summary%26gt;
  ///Fielddescriptor
  ///%26lt;/summary%26gt;
  [StructLayout(LayoutKind.Sequential)]
  internalclassMYSQL_FIELD_VERSION_5:IMYSQL_FIELD
  {
  ///%26lt;summary%26gt;
  ///Nameofcolumn
  ///%26lt;/summary%26gt;
  publicstringname;   
  ///%26lt;summary%26gt;
  ///Originalcolumnname,ifanalias
  ///%26lt;/summary%26gt;
  publicstringorg_name;  
  ///%26lt;summary%26gt;
  ///Tableofcolumnifcolumnwasafield
  ///%26lt;/summary%26gt;
  publicstringtable;  
  ///%26lt;summary%26gt;
  ///Orgtablenameiftablewasanalias
  ///%26lt;/summary%26gt;
  publicstringorg_table;  
  ///%26lt;summary%26gt;
  ///Databasefortable
  ///%26lt;/summary%26gt;
  publicstringdb;      
  ///%26lt;summary%26gt;
  ///Catalogfortable
  ///%26lt;/summary%26gt;
    //publicstringcatalog;     
  ///%26lt;summary%26gt;
  ///def
  ///%26lt;/summary%26gt;
  publicstringdef;     
  ///%26lt;summary%26gt;
  ///length
  ///%26lt;/summary%26gt;
  publiclonglength;   
  ///%26lt;summary%26gt;
    ///max_length
  ///%26lt;/summary%26gt;
  publiclongmax_length;  
  ///%26lt;summary%26gt;
  ///name_length
  ///%26lt;/summary%26gt;
    //publicuintname_length;
  ///%26lt;summary%26gt;
  ///org_name_length
  ///%26lt;/summary%26gt;
  publicuintorg_name_length;
  ///%26lt;summary%26gt;
  ///table_length
  ///%26lt;/summary%26gt;
  publicuinttable_length;
  ///%26lt;summary%26gt;
  ///org_table_length
  ///%26lt;/summary%26gt;
  publicuintorg_table_length;
  ///%26lt;summary%26gt;
  ///db_length
  ///%26lt;/summary%26gt;
  publicuintdb_length;
  ///%26lt;summary%26gt;
  ///catalog_length
  ///%26lt;/summary%26gt;
  publicuintcatalog_length;
  ///%26lt;summary%26gt;
  ///def_length
  ///%26lt;/summary%26gt;
  publicuintdef_length;
  ///%26lt;summary%26gt;
  ///Divflags
  ///%26lt;/summary%26gt;
  publicuintflags;    
  ///%26lt;summary%26gt;
  ///Numberofdecimalsinfield
  ///%26lt;/summary%26gt;
  publicuintdecimals;   
  ///%26lt;summary%26gt;
  ///Characterset
  ///%26lt;/summary%26gt;
  publicuintcharsetnr;  
  ///%26lt;summary%26gt;
  ///Typeoffield.Semysql_com.hfortypes
  ///%26lt;/summary%26gt;
  publicuinttype;
  ///%26lt;summary%26gt;
  ///Name
  ///%26lt;/summary%26gt;
  publicstringName
  {
    get  {returnname;}
  }
  ///%26lt;summary%26gt;
  ///Type
  ///%26lt;/summary%26gt;
  publicuintType
  {
    get  {returntype;}
  }
  ///%26lt;summary%26gt;
  ///Max_Length
  ///%26lt;/summary%26gt;
  publiclongMax_Length
  {
    get  {returnmax_length;}
  }
  }
  //[StructLayout(LayoutKind.Explicit)]
  publicenumenum_field_types
  {
    FIELD_TYPE_DECIMAL,FIELD_TYPE_TINY,
            FIELD_TYPE_SHORT,FIELD_TYPE_LONG,
              FIELD_TYPE_FLOAT,FIELD_TYPE_DOUBLE,
              FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP,
              FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
              FIELD_TYPE_DATE, FIELD_TYPE_TIME,
              FIELD_TYPE_DATETIME,FIELD_TYPE_YEAR,
              FIELD_TYPE_NEWDATE,
              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,
              FIELD_TYPE_GEOMETRY=255
  };
  ///%26lt;summary%26gt;
  ///Cprototypeswarpperformysqllib.
  ///%26lt;/summary%26gt;
  internalclassCPrototypes
  {
    [DllImport("libmySQL.dll",EntryPoint="mysql_init")]
  unsafepublicstaticexternvoid*mysql_init(void*must_be_null);
    [DllImport("libmySQL.dll",EntryPoint="mysql_close")]
  unsafepublicstaticexternvoidmysql_close(void*handle);
  //BEGINADDITION2004-07-01BYAlexSeewald
  //Enablesustocallmysql_optiontoactivatecompressionandtimeout
    [DllImport("libmySQL.dll",EntryPoint="mysql_options")]  
  unsafepublicstaticexternvoidmysql_options(void*mysql,uintoption,uint*value);
  //ENDADDITION2004-07-01ByAlexSeewald
    [DllImport("libmySQL.dll",EntryPoint="mysql_real_connect")]
  unsafepublicstaticexternvoid*mysql_real_connect(void*mysql,stringhost,stringuser,stringpasswd,stringdb,uintport,stringunix_socket,intclient_flag);
    [DllImport("libmySQL.dll",EntryPoint="mysql_query")]
  unsafepublicstaticexternintmysql_query(void*mysql,stringquery);
    [DllImport("libmySQL.dll",EntryPoint="mysql_store_result")]
  unsafepublicstaticexternvoid*mysql_store_result(void*mysql);
    [DllImport("libmySQL.dll",EntryPoint="mysql_free_result")]
  unsafepublicstaticexternvoidmysql_free_result(void*result);
    [DllImport("libmySQL.dll",EntryPoint="mysql_errno")]
  unsafepublicstaticexternuintmysql_errno(void*mysql);
    [DllImport("libmySQL.dll",EntryPoint="mysql_error")]
  unsafepublicstaticexternstringmysql_error(void*mysql);
    [DllImport("libmySQL.dll",EntryPoint="mysql_field_count")]
  unsafepublicstaticexternuintmysql_field_count(void*mysql);
    [DllImport("libmySQL.dll",EntryPoint="mysql_affected_rows")]
  unsafepublicstaticexternulongmysql_affected_rows(void*mysql);
    [DllImport("libmySQL.dll",EntryPoint="mysql_num_fields")]
  unsafepublicstaticexternuintmysql_num_fields(void*result);
    [DllImport("libmySQL.dll",EntryPoint="mysql_num_rows")]
  unsafepublicstaticexternulongmysql_num_rows(void*result);
    [DllImport("libmySQL.dll",EntryPoint="mysql_fetch_field_direct")]
  unsafepublicstaticexternIntPtrmysql_fetch_field_direct(void*result,uintfieldnr);
    ///%26lt;returns%26gt;Returnsastringthatrepresentstheclientlibraryversion%26lt;/returns%26gt;
    [DllImport("libmySQL.dll",CharSet=System.Runtime.InteropServices.CharSet.Ansi,
    EntryPoint="mysql_get_client_info",ExactSpelling=true)]
  publicstaticexternstringGetClientInfo();
    [DllImport("libmySQL.dll",EntryPoint="mysql_fetch_row")]
  unsafepublicstaticexternIntPtrmysql_fetch_row(void*result);
    [DllImport("libmySQL.dll",EntryPoint="mysql_select_db")]
  unsafepublicstaticexternintmysql_select_db(void*mysql,stringdbname);
    [DllImport("libmySQL.dll",EntryPoint="mysql_fetch_lengths")]
  unsafepublicstaticexternUInt32*mysql_fetch_lengths(void*result);
  }
  } 基本上是将C风格的基础数据结构进行.net的重新定义,然后通过InteropServices进行访问。
  具体如何利用这个库进行操作,可以参考其中的例子。
页: [1]
查看完整版本: .NET如何访问MySQL数据库