NET的数据库天然支持MSSQLServer但是并非其他数据库不支持而是微软基于自身利益需要在支持营销上推自己的数据库产品;但是作为平台战略他并非排斥其他数据库而是参考java体系提出了一套数据库访问规范让各个第三方进行开发提供特定的驱动
MySQL是免费的数据库在成本上具有无可替代的优势但是目前来讲并没有提供微软把MySQL当作ODBC数据库可以按照ODBCNet规范进行访问具体参考
而实际上针对ODBCNet的需要配置DSN的麻烦而是出现了一个开源的系统MySQLDriverCS对MySQL的开发进行了封装实现环境下对于MySQL数据库系统的访问
通过阅读源代码我们看到MySQLDriverCS的思路是利用C函数的底层库来操纵数据库的通常提供对MySQL数据库的访问的数据库的C DLL是名为libmySQLdll的驱动文件MySQLDriverCS作为一库进行封装C风格的驱动
具体如何进行呢?
打开工程后我们看到其中有一个比较特殊的cs文件CPrototypescs
以下是引用片段
#region LICENSE
/*
MySQLDriverCS: An C# driver for MySQL
Copyright (c) Manuel Lucas Vi馻s Livschitz
This file is part of MySQLDriverCS
MySQLDriverCS 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 of the License or
(at your option) any later version
MySQLDriverCS 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 MySQLDriverCS; if not write to the Free Software
Foundation Inc Temple Place Suite Boston MA USA
*/
#endregion
using System;
using SystemData;
using SystemRuntimeInteropServices;
namespace MySQLDriverCS
{
//[StructLayout(LayoutKindSequential)]
public class MYSQL_FIELD_FACTORY
{
static string version;
public static IMYSQL_FIELD GetInstance()
{
if (version==null)
{
version = CPrototypesGetClientInfo();
}
if (versionCompareTo(alpha)>=)
{
return new MYSQL_FIELD_VERSION_();
}
else
return new MYSQL_FIELD_VERSION_();
}
}
public interface IMYSQL_FIELD
{
string Name{get;}
uint Type{get;}
long Max_Length {get;}
}
///<summary>
/// Field descriptor
///</summary>
[StructLayout(LayoutKindSequential)]// alpha
internal class MYSQL_FIELD_VERSION_: IMYSQL_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_comh 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(LayoutKindSequential)]
internal class MYSQL_FIELD_VERSION_: IMYSQL_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_comh 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(LayoutKindExplicit)]
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_LONGLONGFIELD_TYPE_INT
FIELD_TYPE_DATE FIELD_TYPE_TIME
FIELD_TYPE_DATETIME FIELD_TYPE_YEAR
FIELD_TYPE_NEWDATE
FIELD_TYPE_ENUM=
FIELD_TYPE_SET=
FIELD_TYPE_TINY_BLOB=
FIELD_TYPE_MEDIUM_BLOB=
FIELD_TYPE_LONG_BLOB=
FIELD_TYPE_BLOB=
FIELD_TYPE_VAR_STRING=
FIELD_TYPE_STRING=
FIELD_TYPE_GEOMETRY=
};
///<summary>
/// C prototypes warpper for mysqllib
///</summary>
internal class CPrototypes
{
[ DllImport( libmySQLdll EntryPoint=mysql_init )]
unsafe public static extern void* mysql_init(void* must_be_null);
[ DllImport( libmySQLdll EntryPoint=mysql_close )]
unsafe public static extern void mysql_close(void* handle);
// BEGIN ADDITION BY Alex Seewald
// Enables us to call mysql_option to activate compression and timeout
[ DllImport( libmySQLdll EntryPoint=mysql_options )]
unsafe public static extern void mysql_options(void* mysql uint option uint *value);
// END ADDITION By Alex Seewald
[ DllImport( libmySQLdll EntryPoint=mysql_real_connect )]
unsafe public static extern void* mysql_real_connect(void* mysql string host string user string passwd string db uint port string unix_socket int client_flag);
[ DllImport( libmySQLdll EntryPoint=mysql_query )]
unsafe public static extern int mysql_query(void*mysql string query);
[ DllImport( libmySQLdll EntryPoint=mysql_store_result )]
unsafe public static extern void *mysql_store_result(void *mysql);
[ DllImport( libmySQLdll EntryPoint=mysql_free_result )]
unsafe public static extern void mysql_free_result(void*result);
[ DllImport( libmySQLdll EntryPoint=mysql_errno )]
unsafe public static extern uint mysql_errno(void*mysql);
[ DllImport( libmySQLdll EntryPoint=mysql_error )]
unsafe public static extern string mysql_error(void*mysql);
[ DllImport( libmySQLdll EntryPoint=mysql_field_count )]
unsafe public static extern uint mysql_field_count(void*mysql);
[ DllImport( libmySQLdll EntryPoint=mysql_affected_rows )]
unsafe public static extern ulong mysql_affected_rows(void*mysql);
[ DllImport( libmySQLdll EntryPoint=mysql_num_fields )]
unsafe public static extern uint mysql_num_fields(void*result);
[ DllImport( libmySQLdll EntryPoint=mysql_num_rows )]
unsafe public static extern ulong mysql_num_rows(void *result);
[ DllImport( libmySQLdll EntryPoint=mysql_fetch_field_direct )]
unsafe public static extern IntPtr mysql_fetch_field_direct(void*result uint fieldnr);
///<returns>Returns a string that represents the client library version</returns>
[DllImport(libmySQLdllCharSet=SystemRuntimeInteropServicesCharSetAnsi
EntryPoint=mysql_get_client_info ExactSpelling=true)]
public static extern string GetClientInfo();
[ DllImport( libmySQLdll EntryPoint=mysql_fetch_row )]
unsafe public static extern IntPtr mysql_fetch_row(void*result);
[ DllImport( libmySQLdll EntryPoint=mysql_select_db )]
unsafe public static extern int mysql_select_db(void*mysqlstring dbname);
[ DllImport( libmySQLdll EntryPoint=mysql_fetch_lengths )]
unsafe public static extern UInt *mysql_fetch_lengths(void*result);
}
}
基本上是将C风格的基础数据结构进的重新定义然后通过InteropServices进行访问
具体如何利用这个库进行操作可以参考其中的例子