程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 訪問MySQL數據庫用.NET!

訪問MySQL數據庫用.NET!

編輯:MySQL綜合教程

以下的文章主要介紹的是用.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:

以下是引用片段:

  1. #region LICENSE  
  2. /*  
  3. MySQL(和PHP搭配之最佳組合)DriverCS: An C# driver for MySQL(和PHP搭配之最佳組合).  
  4. Copyright (c) 2002 Manuel Lucas Vi馻s Livschitz.  
  5. This file is part of MySQL(和PHP搭配之最佳組合)DriverCS.  
  6. MySQL(和PHP搭配之最佳組合)DriverCS is free software; you can redistribute it and/or modify  
  7. it under the terms of the GNU General Public License as published by  
  8. the Free Software Foundation; either version 2 of the License, or  
  9. (at your option) any later version.  
  10. MySQL(和PHP搭配之最佳組合)DriverCS is distributed in the hope that it will be useful,  
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of  
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
  13. GNU General Public License for more details.  
  14. You should have received a copy of the GNU General Public License  
  15. along with MySQL(和PHP搭配之最佳組合)DriverCS; if not, write to the Free Software  
  16. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  
  17. */  
  18. #endregion  
  19. using System;  
  20. using System.Data;  
  21. using System.Runtime.InteropServices;  
  22. namespace MySQL(和PHP搭配之最佳組合)DriverCS  
  23. {  
  24. //[StructLayout(LayoutKind.Sequential)]  
  25. public class MySQL(和PHP搭配之最佳組合)_FIELD_FACTORY  
  26. {  
  27. static string version;  
  28. public static IMySQL(和PHP搭配之最佳組合)_FIELD GetInstance()  
  29. {  
  30. if (version==null)   
  31. {  
  32. version = CPrototypes.GetClientInfo();  
  33. }  
  34. if (version.CompareTo("4.1.2-alpha")>=0)   
  35. {  
  36. return new MySQL(和PHP搭配之最佳組合)_FIELD_VERSION_5();  
  37. }  
  38. else   
  39. return new MySQL(和PHP搭配之最佳組合)_FIELD_VERSION_3();  
  40. }  
  41. }  
  42. public interface IMySQL(和PHP搭配之最佳組合)_FIELD  
  43. {  
  44. string Name{get;}  
  45. uint Type{get;}  
  46. long Max_Length {get;}  
  47. }  
  48. ///<summary> 
  49. /// Field descriptor  
  50. ///</summary> 
  51. [StructLayout(LayoutKind.Sequential)]//"3.23.32", 4.0.1-alpha  
  52. internal class MySQL(和PHP搭配之最佳組合)_FIELD_VERSION_3: IMySQL(和PHP搭配之最佳組合)_FIELD   
  53. {  
  54. ///<summary> 
  55. /// Name of column  
  56. ///</summary> 
  57. public string name;   
  58. ///<summary> 
  59. /// Table of column if column was a field  
  60. ///</summary> 
  61. public string table;   
  62. //public string org_table; /* Org table name if table was an alias */  
  63. //public string db; /* Database for table */  
  64. ///<summary> 
  65. /// def  
  66. ///</summary> 
  67. public string def;   
  68. ///<summary> 
  69. /// length  
  70. ///</summary> 
  71. public long length;   
  72. ///<summary> 
  73. /// max_length  
  74. ///</summary> 
  75. public long max_length;   
  76. ///<summary> 
  77. /// Div flags  
  78. ///</summary> 
  79. public uint flags;   
  80. ///<summary> 
  81. /// Number of decimals in field   
  82. ///</summary> 
  83. public uint decimals;   
  84. ///<summary> 
  85. /// Type of field. Se MySQL(和PHP搭配之最佳組合)_com.h for types   
  86. ///</summary> 
  87. public uint type;   
  88. ///<summary> 
  89. /// Name  
  90. ///</summary> 
  91. public string Name  
  92. {  
  93. get{return name;}  
  94. }  
  95. ///<summary> 
  96. /// Type  
  97. ///</summary> 
  98. public uint Type  
  99. {  
  100. get{return type;}  
  101. }  
  102. ///<summary> 
  103. /// Max_Length  
  104. ///</summary> 
  105. public long Max_Length  
  106. {  
  107. get {return max_length;}  
  108. }  
  109. }   
  110. ///<summary> 
  111. /// Field descriptor  
  112. ///</summary> 
  113. [StructLayout(LayoutKind.Sequential)]  
  114. internal class MySQL(和PHP搭配之最佳組合)_FIELD_VERSION_5: IMySQL(和PHP搭配之最佳組合)_FIELD   
  115. {  
  116. ///<summary> 
  117. /// Name of column   
  118. ///</summary> 
  119. public string name;   
  120. ///<summary> 
  121. /// Original column name, if an alias  
  122. ///</summary> 
  123. public string org_name;   
  124. ///<summary> 
  125. /// Table of column if column was a field  
  126. ///</summary> 
  127. public string table;   
  128. ///<summary> 
  129. /// Org table name if table was an alias  
  130. ///</summary> 
  131. public string org_table;   
  132. ///<summary> 
  133. /// Database for table  
  134. ///</summary> 
  135. public string db;   
  136. ///<summary> 
  137. /// Catalog for table  
  138. ///</summary> 
  139. //public string catalog;   
  140. ///<summary> 
  141. /// def  
  142. ///</summary> 
  143. public string def;   
  144. ///<summary> 
  145. /// length  
  146. ///</summary> 
  147. public long length;   
  148. ///<summary> 
  149. /// max_length  
  150. ///</summary> 
  151. public long max_length;   
  152. ///<summary> 
  153. /// name_length  
  154. ///</summary> 
  155. //public uint name_length;  
  156. ///<summary> 
  157. /// org_name_length  
  158. ///</summary> 
  159. public uint org_name_length;  
  160. ///<summary> 
  161. /// table_length  
  162. ///</summary> 
  163. public uint table_length;  
  164. ///<summary> 
  165. /// org_table_length  
  166. ///</summary> 
  167. public uint org_table_length;  
  168. ///<summary> 
  169. /// db_length  
  170. ///</summary> 
  171. public uint db_length;  
  172. ///<summary> 
  173. /// catalog_length  
  174. ///</summary> 
  175. public uint catalog_length;  
  176. ///<summary> 
  177. /// def_length  
  178. ///</summary> 
  179. public uint def_length;  
  180. ///<summary> 
  181. /// Div flags  
  182. ///</summary> 
  183. public uint flags;   
  184. ///<summary> 
  185. /// Number of decimals in field  
  186. ///</summary> 
  187. public uint decimals;   
  188. ///<summary> 
  189. /// Character set  
  190. ///</summary> 
  191. public uint charsetnr;   
  192. ///<summary> 
  193. /// Type of field. Se MySQL(和PHP搭配之最佳組合)_com.h for types  
  194. ///</summary> 
  195. public uint type;   
  196. ///<summary> 
  197. /// Name  
  198. ///</summary> 
  199. public string Name  
  200. {  
  201. get {return name;}  
  202. }  
  203. ///<summary> 
  204. /// Type  
  205. ///</summary> 
  206. public uint Type  
  207. {  
  208. get {return type;}  
  209. }  
  210. ///<summary> 
  211. /// Max_Length  
  212. ///</summary> 
  213. public long Max_Length  
  214. {  
  215. get {return max_length;}  
  216. }  
  217. }   
  218. //[StructLayout(LayoutKind.Explicit)]  
  219. public enum enum_field_types   
  220. {  
  221. FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,  
  222. FIELD_TYPE_SHORT, FIELD_TYPE_LONG,  
  223. FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE,  
  224. FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP,  
  225. FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,  
  226. FIELD_TYPE_DATE, FIELD_TYPE_TIME,  
  227. FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR,  
  228. FIELD_TYPE_NEWDATE,  
  229. FIELD_TYPE_ENUM=247,  
  230. FIELD_TYPE_SET=248,  
  231. FIELD_TYPE_TINY_BLOB=249,  
  232. FIELD_TYPE_MEDIUM_BLOB=250,  
  233. FIELD_TYPE_LONG_BLOB=251,  
  234. FIELD_TYPE_BLOB=252,  
  235. FIELD_TYPE_VAR_STRING=253,  
  236. FIELD_TYPE_STRING=254,  
  237. FIELD_TYPE_GEOMETRY=255 
  238. };  
  239. ///<summary> 
  240. /// C prototypes warpper for MySQL(和PHP搭配之最佳組合)lib.  
  241. ///</summary> 
  242. internal class CPrototypes  
  243. {  
  244. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_init" )]  
  245. unsafe public static extern void* MySQL(和PHP搭配之最佳組合)_init(void* must_be_null);  
  246. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_close" )]  
  247. unsafe public static extern void MySQL(和PHP搭配之最佳組合)_close(void* handle);  
  248. // BEGIN ADDITION 2004-07-01 BY Alex Seewald  
  249. // Enables us to call MySQL(和PHP搭配之最佳組合)_option to activate compression and timeout  
  250. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_options" )]   
  251. unsafe public static extern void MySQL(和PHP搭配之最佳組合)_options(void* MySQL(和PHP搭配之最佳組合), uint option, uint *value);  
  252. // END ADDITION 2004-07-01 By Alex Seewald  
  253. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_real_connect" )]  
  254. 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);  
  255. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_query" )]  
  256. unsafe public static extern int MySQL(和PHP搭配之最佳組合)_query(void*MySQL(和PHP搭配之最佳組合), string query);  
  257. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_store_result" )]  
  258. unsafe public static extern void *MySQL(和PHP搭配之最佳組合)_store_result(void *MySQL(和PHP搭配之最佳組合));  
  259. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_free_result" )]  
  260. unsafe public static extern void MySQL(和PHP搭配之最佳組合)_free_result(void*result);  
  261. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_errno" )]  
  262. unsafe public static extern uint MySQL(和PHP搭配之最佳組合)_errno(void*MySQL(和PHP搭配之最佳組合));  
  263. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_error" )]  
  264. unsafe public static extern string MySQL(和PHP搭配之最佳組合)_error(void*MySQL(和PHP搭配之最佳組合));  
  265. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_field_count" )]  
  266. unsafe public static extern uint MySQL(和PHP搭配之最佳組合)_field_count(void*MySQL(和PHP搭配之最佳組合));  
  267. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_affected_rows" )]  
  268. unsafe public static extern ulong MySQL(和PHP搭配之最佳組合)_affected_rows(void*MySQL(和PHP搭配之最佳組合));  
  269. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_num_fields" )]  
  270. unsafe public static extern uint MySQL(和PHP搭配之最佳組合)_num_fields(void*result);  
  271. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_num_rows" )]  
  272. unsafe public static extern ulong MySQL(和PHP搭配之最佳組合)_num_rows(void *result);  
  273. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_fetch_field_direct" )]  
  274. unsafe public static extern IntPtr MySQL(和PHP搭配之最佳組合)_fetch_field_direct(void*result, uint fieldnr);  
  275. ///<returns>Returns a string that represents the client library version</returns> 
  276. [DllImport("libMySQL(和PHP搭配之最佳組合).dll",CharSet=System.Runtime.InteropServices.CharSet.Ansi,  
  277. EntryPoint="MySQL(和PHP搭配之最佳組合)_get_client_info", ExactSpelling=true)]  
  278. public static extern string GetClientInfo();  
  279. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_fetch_row" )]  
  280. unsafe public static extern IntPtr MySQL(和PHP搭配之最佳組合)_fetch_row(void*result);  
  281. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_select_db" )]  
  282. unsafe public static extern int MySQL(和PHP搭配之最佳組合)_select_db(void*MySQL(和PHP搭配之最佳組合),string dbname);  
  283. [ DllImport( "libMySQL(和PHP搭配之最佳組合).dll", EntryPoint="MySQL(和PHP搭配之最佳組合)_fetch_lengths" )]  
  284. unsafe public static extern UInt32 *MySQL(和PHP搭配之最佳組合)_fetch_lengths(void*result);  
  285. }  
  286. }   

基本上是將C風格的基礎數據結構進行.net的重新定義,然後通過InteropServices進行訪問。具體如何利用這個庫進行操作,可以參考其中的例子。以上的相關內容就是對.NET如何訪問MySQL數據庫的介紹,望你能有所收獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved