2022-10-27 344
以下的文章主要介绍的是用.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:
以下是引用片段:
#regionLICENSE /* MySQL(和PHP搭配之***组合)DriverCS:AnC#driverforMySQL(和PHP搭配之***组合). Copyright(c)2002ManuelLucasVi馻sLivschitz. ThisfileispartofMySQL(和PHP搭配之***组合)DriverCS. MySQL(和PHP搭配之***组合)DriverCSisfreesoftware;youcanredistributeitand/ormodify itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby theFreeSoftwareFoundation;eitherversion2oftheLicense,or (atyouroption)anylaterversion. MySQL(和PHP搭配之***组合)DriverCSisdistributedinthehopethatitwillbeuseful, butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe GNUGeneralPublicLicenseformoredetails. YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwithMySQL(和PHP搭配之***组合)DriverCS;ifnot,writetotheFreeSoftware Foundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USA */ #endregion usingSystem; usingSystem.Data; usingSystem.Runtime.InteropServices; namespaceMySQL(和PHP搭配之***组合)DriverCS { //[StructLayout(LayoutKind.Sequential)] publicclassMySQL(和PHP搭配之***组合)_FIELD_FACTORY { staticstringversion; publicstaticIMySQL(和PHP搭配之***组合)_FIELDGetInstance() { if(version==null) { version=CPrototypes.GetClientInfo(); } if(version.CompareTo("4.1.2-alpha")>=0) { returnnewMySQL(和PHP搭配之***组合)_FIELD_VERSION_5(); } else returnnewMySQL(和PHP搭配之***组合)_FIELD_VERSION_3(); } } publicinterfaceIMySQL(和PHP搭配之***组合)_FIELD { stringName{get;} uintType{get;} longMax_Length{get;} } ///<summary> ///Fielddescriptor ///</summary> [StructLayout(LayoutKind.Sequential)]//"3.23.32",4.0.1-alpha internalclassMySQL(和PHP搭配之***组合)_FIELD_VERSION_3:IMySQL(和PHP搭配之***组合)_FIELD { ///<summary> ///Nameofcolumn ///</summary> publicstringname; ///<summary> ///Tableofcolumnifcolumnwasafield ///</summary> publicstringtable; //publicstringorg_table;/*Orgtablenameiftablewasanalias*/ //publicstringdb;/*Databasefortable*/ ///<summary> ///def ///</summary> publicstringdef; ///<summary> ///length ///</summary> publiclonglength; ///<summary> ///max_length ///</summary> publiclongmax_length; ///<summary> ///Divflags ///</summary> publicuintflags; ///<summary> ///Numberofdecimalsinfield ///</summary> publicuintdecimals; ///<summary> ///Typeoffield.SeMySQL(和PHP搭配之***组合)_com.hfortypes ///</summary> publicuinttype; ///<summary> ///Name ///</summary> publicstringName { get{returnname;} } ///<summary> ///Type ///</summary> publicuintType { get{returntype;} } ///<summary> ///Max_Length ///</summary> publiclongMax_Length { get{returnmax_length;} } } ///<summary> ///Fielddescriptor ///</summary> [StructLayout(LayoutKind.Sequential)] internalclassMySQL(和PHP搭配之***组合)_FIELD_VERSION_5:IMySQL(和PHP搭配之***组合)_FIELD { ///<summary> ///Nameofcolumn ///</summary> publicstringname; ///<summary> ///Originalcolumnname,ifanalias ///</summary> publicstringorg_name; ///<summary> ///Tableofcolumnifcolumnwasafield ///</summary> publicstringtable; ///<summary> ///Orgtablenameiftablewasanalias ///</summary> publicstringorg_table; ///<summary> ///Databasefortable ///</summary> publicstringdb; ///<summary> ///Catalogfortable ///</summary> //publicstringcatalog; ///<summary> ///def ///</summary> publicstringdef; ///<summary> ///length ///</summary> publiclonglength; ///<summary> ///max_length ///</summary> publiclongmax_length; ///<summary> ///name_length ///</summary> //publicuintname_length; ///<summary> ///org_name_length ///</summary> publicuintorg_name_length; ///<summary> ///table_length ///</summary> publicuinttable_length; ///<summary> ///org_table_length ///</summary> publicuintorg_table_length; ///<summary> ///db_length ///</summary> publicuintdb_length; ///<summary> ///catalog_length ///</summary> publicuintcatalog_length; ///<summary> ///def_length ///</summary> publicuintdef_length; ///<summary> ///Divflags ///</summary> publicuintflags; ///<summary> ///Numberofdecimalsinfield ///</summary> publicuintdecimals; ///<summary> ///Characterset ///</summary> publicuintcharsetnr; ///<summary> ///Typeoffield.SeMySQL(和PHP搭配之***组合)_com.hfortypes ///</summary> publicuinttype; ///<summary> ///Name ///</summary> publicstringName { get{returnname;} } ///<summary> ///Type ///</summary> publicuintType { get{returntype;} } ///<summary> ///Max_Length ///</summary> 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 }; ///<summary> ///CprototypeswarpperforMySQL(和PHP搭配之***组合)lib. ///</summary> internalclassCPrototypes { [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_init")] unsafepublicstaticexternvoid*MySQL(和PHP搭配之***组合)_init(void*must_be_null); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_close")] unsafepublicstaticexternvoidMySQL(和PHP搭配之***组合)_close(void*handle); //BEGINADDITION2004-07-01BYAlexSeewald //EnablesustocallMySQL(和PHP搭配之***组合)_optiontoactivatecompressionandtimeout [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_options")] unsafepublicstaticexternvoidMySQL(和PHP搭配之***组合)_options(void*MySQL(和PHP搭配之***组合),uintoption,uint*value); //ENDADDITION2004-07-01ByAlexSeewald [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_real_connect")] unsafepublicstaticexternvoid*MySQL(和PHP搭配之***组合)_real_connect(void*MySQL(和PHP搭配之***组合), stringhost,stringuser,stringpasswd,stringdb,uintport,stringunix_socket,intclient_flag); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_query")] unsafepublicstaticexternintMySQL(和PHP搭配之***组合)_query(void*MySQL(和PHP搭配之***组合),stringquery); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_store_result")] unsafepublicstaticexternvoid*MySQL(和PHP搭配之***组合)_store_result(void*MySQL(和PHP搭配之***组合)); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_free_result")] unsafepublicstaticexternvoidMySQL(和PHP搭配之***组合)_free_result(void*result); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_errno")] unsafepublicstaticexternuintMySQL(和PHP搭配之***组合)_errno(void*MySQL(和PHP搭配之***组合)); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_error")] unsafepublicstaticexternstringMySQL(和PHP搭配之***组合)_error(void*MySQL(和PHP搭配之***组合)); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_field_count")] unsafepublicstaticexternuintMySQL(和PHP搭配之***组合)_field_count(void*MySQL(和PHP搭配之***组合)); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_affected_rows")] unsafepublicstaticexternulongMySQL(和PHP搭配之***组合)_affected_rows(void*MySQL(和PHP搭配之***组合)); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_num_fields")] unsafepublicstaticexternuintMySQL(和PHP搭配之***组合)_num_fields(void*result); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_num_rows")] unsafepublicstaticexternulongMySQL(和PHP搭配之***组合)_num_rows(void*result); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_fetch_field_direct")] unsafepublicstaticexternIntPtrMySQL(和PHP搭配之***组合)_fetch_field_direct(void*result,uintfieldnr); ///<returns>Returnsastringthatrepresentstheclientlibraryversion</returns> [DllImport("libMySQL(和PHP搭配之***组合).dll",CharSet=System.Runtime.InteropServices.CharSet.Ansi, EntryPoint="MySQL(和PHP搭配之***组合)_get_client_info",ExactSpelling=true)] publicstaticexternstringGetClientInfo(); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_fetch_row")] unsafepublicstaticexternIntPtrMySQL(和PHP搭配之***组合)_fetch_row(void*result); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_select_db")] unsafepublicstaticexternintMySQL(和PHP搭配之***组合)_select_db(void*MySQL(和PHP搭配之***组合),stringdbname); [DllImport("libMySQL(和PHP搭配之***组合).dll",EntryPoint="MySQL(和PHP搭配之***组合)_fetch_lengths")] unsafepublicstaticexternUInt32*MySQL(和PHP搭配之***组合)_fetch_lengths(void*result); } }
基本上是将C风格的基础数据结构进行.net的重新定义,然后通过InteropServices进行访问。具体如何利用这个库进行操作,可以参考其中的例子。
原文链接:https://77isp.com/post/9822.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态