以下的文章主要介绍的是用.net访问mysql数据库的实际操作步骤,我们大家都知道 .net的数据库本身就支持mssql(windows平台上强大的数据库平台)server,但是并不是其他数据库不支持,而是微软基于自身利益需要。
在支持、营销上推自己的mysql数据库产品;但是作为平台战略,他并非排斥其他数据库,而是参考java体系提出了一套数据库访问规范,让各个第三方进行开发,提供特定的驱动。
mysql(和php搭配之最佳组合)是免费的数据库,在成本上具有无可替代的优势,但是目前来讲,并没有提供。微软把mysql(和php搭配之最佳组合)当作odbc数据库,可以按照odbc.net规范进行访问,具体参考
而实际上,针对odbc。net的需要配置dsn的麻烦,而是出现了一个开源的系统mysql(和php搭配之最佳组合)drivercs,对mysql(和php搭配之最佳组合)的开发进行了封装,实现了.net环境下对于mysql数据库系统的访问。
通过阅读源代码,我们看到mysql(和php搭配之最佳组合)drivercs的思路是利用c函数的底层库来操纵数据库的,通常提供对mysql(和php搭配之最佳组合)数据库的访问的mysql数据库的c dll是名为libmysql(和php搭配之最佳组合).dll的驱动文件,mysql(和php搭配之最佳组合)drivercs作为一个.net库进行封装c风格的驱动。
具体如何进行呢?
打开工程后,我们看到其中有一个比较特殊的.cs文件cprototypes.cs:
以下是引用片段:
#region license /* mysql(和php搭配之最佳组合)drivercs: an c# driver for mysql(和php搭配之最佳组合). copyright (c) 2002 manuel lucas vi馻s livschitz. this file is part of mysql(和php搭配之最佳组合)drivercs. mysql(和php搭配之最佳组合)drivercs is free software; you can redistribute it and/or modify it under the terms of the gnu general public license as published by the free software foundation; either version 2 of the license, or (at your option) any later version. mysql(和php搭配之最佳组合)drivercs is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. see the gnu general public license for more details. you should have received a copy of the gnu general public license along with mysql(和php搭配之最佳组合)drivercs; if not, write to the free software foundation, inc., 59 temple place, suite 330, boston, ma 02111-1307 usa */ #endregion using system; using system.data; using system.runtime.interopservices; namespace mysql(和php搭配之最佳组合)drivercs { //[structlayout(layoutkind.sequential)] public class mysql(和php搭配之最佳组合)_field_factory { static string version; public static imysql(和php搭配之最佳组合)_field getinstance() { if (version==null) { version = cprototypes.getclientinfo(); } if (version.compareto(4.1.2-alpha)>=0) { return new mysql(和php搭配之最佳组合)_field_version_5(); } else return new mysql(和php搭配之最佳组合)_field_version_3(); } } public interface imysql(和php搭配之最佳组合)_field { string name{get;} uint type{get;} long max_length {get;} } ///summary> /// field descriptor ///summary> [structlayout(layoutkind.sequential)]//3.23.32, 4.0.1-alpha internal class mysql(和php搭配之最佳组合)_field_version_3: imysql(和php搭配之最佳组合)_field { ///summary> /// name of column ///summary> public string name; ///summary> /// table of column if column was a field ///summary> public string table; //public string org_table; /* org table name if table was an alias */ //public string db; /* database for table */ ///summary> /// def ///summary> public string def; ///summary> /// length ///summary> public long length; ///summary> /// max_length ///summary> public long max_length; ///summary> /// div flags ///summary> public uint flags; ///summary> /// number of decimals in field ///summary> public uint decimals; ///summary> /// type of field. se mysql(和php搭配之最佳组合)_com.h for types ///summary> public uint type; ///summary> /// name ///summary> public string name { get{return name;} } ///summary> /// type ///summary> public uint type { get{return type;} } ///summary> /// max_length ///summary> public long max_length { get {return max_length;} } } ///summary> /// field descriptor ///summary> [structlayout(layoutkind.sequential)] internal class mysql(和php搭配之最佳组合)_field_version_5: imysql(和php搭配之最佳组合)_field { ///summary> /// name of column ///summary> public string name; ///summary> /// original column name, if an alias ///summary> public string org_name; ///summary> /// table of column if column was a field ///summary> public string table; ///summary> /// org table name if table was an alias ///summary> public string org_table; ///summary> /// database for table ///summary> public string db; ///summary> /// catalog for table ///summary> //public string catalog; ///summary> /// def ///summary> public string def; ///summary> /// length ///summary> public long length; ///summary> /// max_length ///summary> public long max_length; ///summary> /// name_length ///summary> //public uint name_length; ///summary> /// org_name_length ///summary> public uint org_name_length; ///summary> /// table_length ///summary> public uint table_length; ///summary> /// org_table_length ///summary> public uint org_table_length; ///summary> /// db_length ///summary> public uint db_length; ///summary> /// catalog_length ///summary> public uint catalog_length; ///summary> /// def_length ///summary> public uint def_length; ///summary> /// div flags ///summary> public uint flags; ///summary> /// number of decimals in field ///summary> public uint decimals; ///summary> /// character set ///summary> public uint charsetnr; ///summary> /// type of field. se mysql(和php搭配之最佳组合)_com.h for types ///summary> public uint type; ///summary> /// name ///summary> public string name { get {return name;} } ///summary> /// type ///summary> public uint type { get {return type;} } ///summary> /// max_length ///summary> public long max_length { get {return max_length;} } } //[structlayout(layoutkind.explicit)] public enum enum_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 }; ///summary> /// c prototypes warpper for mysql(和php搭配之最佳组合)lib. ///summary> internal class cprototypes { [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_init )] unsafe public static extern void* mysql(和php搭配之最佳组合)_init(void* must_be_null); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_close )] unsafe public static extern void mysql(和php搭配之最佳组合)_close(void* handle); // begin addition 2004-07-01 by alex seewald // enables us to call mysql(和php搭配之最佳组合)_option to activate compression and timeout [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_options )] unsafe public static extern void mysql(和php搭配之最佳组合)_options(void* mysql(和php搭配之最佳组合), uint option, uint *value); // end addition 2004-07-01 by alex seewald [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_real_connect )] unsafe public static extern void* mysql(和php搭配之最佳组合)_real_connect(void* mysql(和php搭配之最佳组合),
string host, string user, string passwd, string db, uint port, string unix_socket, int client_flag); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_query )] unsafe public static extern int mysql(和php搭配之最佳组合)_query(void*mysql(和php搭配之最佳组合), string query); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_store_result )] unsafe public static extern void *mysql(和php搭配之最佳组合)_store_result(void *mysql(和php搭配之最佳组合)); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_free_result )] unsafe public static extern void mysql(和php搭配之最佳组合)_free_result(void*result); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_errno )] unsafe public static extern uint mysql(和php搭配之最佳组合)_errno(void*mysql(和php搭配之最佳组合)); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_error )] unsafe public static extern string mysql(和php搭配之最佳组合)_error(void*mysql(和php搭配之最佳组合)); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_field_count )] unsafe public static extern uint mysql(和php搭配之最佳组合)_field_count(void*mysql(和php搭配之最佳组合)); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_affected_rows )] unsafe public static extern ulong mysql(和php搭配之最佳组合)_affected_rows(void*mysql(和php搭配之最佳组合)); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_num_fields )] unsafe public static extern uint mysql(和php搭配之最佳组合)_num_fields(void*result); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_num_rows )] unsafe public static extern ulong mysql(和php搭配之最佳组合)_num_rows(void *result); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_fetch_field_direct )] unsafe public static extern intptr mysql(和php搭配之最佳组合)_fetch_field_direct(void*result, uint fieldnr); ///returns>returns a string that represents the client library versionreturns> [dllimport(libmysql(和php搭配之最佳组合).dll,charset=system.runtime.interopservices.charset.ansi, entrypoint=mysql(和php搭配之最佳组合)_get_client_info, exactspelling=true)] public static extern string getclientinfo(); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_fetch_row )] unsafe public static extern intptr mysql(和php搭配之最佳组合)_fetch_row(void*result); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_select_db )] unsafe public static extern int mysql(和php搭配之最佳组合)_select_db(void*mysql(和php搭配之最佳组合),string dbname); [ dllimport( libmysql(和php搭配之最佳组合).dll, entrypoint=mysql(和php搭配之最佳组合)_fetch_lengths )] unsafe public static extern uint32 *mysql(和php搭配之最佳组合)_fetch_lengths(void*result); } }
基本上是将c风格的基础数据结构进行.net的重新定义,然后通过interopservices进行访问。具体如何利用这个库进行操作,可以参考其中的例子。以上的相关内容就是对.net如何访问mysql数据库的介绍,望你能有所收获。
