C#使用开源驱动连接操作MySQL数据库


前面一篇 http://www.phpstudy.net/article/61219.htm 讲了 C# 里用 MySQL 官方驱动怎么去连接操作 MySQL 驱动,就是 MySQL 的 JDBC 驱动有两个一样,针对 .NET 的 MySQL 驱动也有两个。这里介绍的就是 .NET 连接 MySQL 的第二个驱动,来自于 Sourceforge 的开源驱动。

首先,到 http://sourceforge.net/projects/mysqldrivercs/ 下载,写此篇时下载的版本是 MySQLDriverCS-n-EasyQueryTools-4.0.1-DotNet2.0.exe。安装,其中带有源代码和例子,只有三个动态库 libmySQL-4.0.dll、libmySQL.dll、MySQLDriverCS.dll,光看动态库好像不及官版的驱动强大。把安装目录中的 MySQLDriverCS.dll 引入到你的 C# 项目中就可以开始用了。具体用法还需时刻关注安装目录中的 help\SDK\Documentation.chm 帮助文档。

也还是围绕着这么几个问题来展开:

基本的用法,如连接字符串的写法,基本查询操作,大概会用到哪些类
异常的处理
事物的处理
参数化的查询支持

这次我会在一个例子中涉及到以上四个方面,下面这个片代码有点混乱,使用时请读懂来,然后才能各取所需:

复制代码 代码如下:

using System;
using System.IO;
 
using MySQLDriverCS; //引入的命名空间就这个
using System.Data.Common;
 
namespace cc.unmi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //MySQLDriverCS 有了 MySQLConnectionStringBuilder 和 MySQLConnectionString 来构造连接字符串
            //其实反而有点故弄玄虚,也许是以前直接用连接字符串习惯了
            MySQLConnectionString conStr = new MySQLConnectionString("localhost", "unmi_db", "unmi", "xxxxxx");
 
            //从 MySQLConnectionStringBuilder 来看似乎可支持的属性较少,不知道连接池那些功能怎么样
            //string connStr = "Data Source=unmi_db;Password=xxxxxx;User ID=unmi;Location=localhost;Port=3306;Extended Properties=";
 
            MySQLConnection conn = new MySQLConnection(conStr.AsString); //或 new MySQLConnection(connStr);
 
            conn.Open();
 
            //参数用 @, 同样支持 ? 的方式, 应该也是不推荐用 ? 的形式
            //string sql = "update wp_options set option_value='http://unmi.cc' where option_id=?id and <a href="mailto:option_name=@name">option_name=@name</a>";
            string sql = "select option_name from wp_options where option_id=?id and <a href="mailto:option_name=@name">option_name=@name</a>";
 
            MySQLCommand com = new MySQLCommand(sql, conn);
 
            MySQLParameter paraId = new MySQLParameter("?id", 1);
            MySQLParameter paraName = new MySQLParameter("@name", "siteurl");
 
            //其实是加在 MySQLParameterCollection 里的
            //看起来与 AddWithValue() 有异曲同功之妙,比如可写成 com.Parameters.Add(new MySQLParameter("@id",1);
            com.Parameters.Add(paraId);
            com.Parameters.Add(paraName);
 
            //如果是查询
            //MySQLDataReader dr = com.ExecuteReaderEx();//执行 ExecuteReaderEx() 返回的才是 MySQLDataReader
 
            DbTransaction trans = conn.BeginTransaction(); //开启事物
 
            try
            {
                //com.ExecuteNonQuery();
                //还要执行更多的语句时应使用事物
                Console.WriteLine(com.ExecuteScalar().ToString());
                trans.Commit();
            }
            catch (MySQLException ex)
            {
                Console.WriteLine(ex.Message);
                trans.Rollback();
            }
            finally
            {
                conn.Close();
            }
 
            Console.ReadKey();
        }
    }
}

虽说那个驱动文件名中有 DotNet2.0 字样,应该只要是 2.0 及以上的 .Net 运行时就行的,我是在 32 位的 XP 下,Visual Studio 2008 中,用 .Net 3.5 来跑的,没有问题。

备注一下,在我家里的电脑上却是运行不起来,提示是:

复制代码 代码如下:

{"Could not load file or assembly 'MySQLDriverCS, Version=3.0.1735.36021, Culture=neutral, PublicKeyToken=172f94dfb0faf263' or one of its dependencies. An attempt was made to load a program with an incorrect format."}

又是我那可恶的 64 位 XP,它只能支持 32 位的应用,与官版的驱动表现不一样。官版的 MSI 程序不能在我的 64 位系统下安装,但安装包中的 .dll 是可在 64 位下用。而这个版本的驱动是能安装,但用起来告诉我不行,明摆着是甩我。其实在下载驱动的网页上有注明用了 32 位的各种 Winows 操作系统云云。

最后简单说下与官版的驱动的少许差异,连接字符串上没有官版驱动丰富,且不知对连接池的支持如何。在用参数化查询设置参数时,虽然比标签的 ADO.Net 方便,便比起官版的可用 AddWithValue() 方法稍微逊色。再就是在 64 位下根本无法运行,这可不能不算是个致使伤,服务器下 64 位系统在所难免。

然而这个开源驱动也有些独到之处,那就是它提供的 MySQLInsertCommand、MySQLSelectCommand、MySQLUpdateCommand 和 MySQLDeleteCommand 类方便了数据操作,不需要你显式的去写 SQL 语句,很像 WordPress 的 $wpdb 中相应的几个函数:$wpdb->insert()、$wpdb->query()、$wpdb->update() 和 $wpdb->delete()。

本不应该把这个驱动这么鲜明的几个特性放后面的。大概看下这几个函数的操作:

复制代码 代码如下:

 new MySQLInsertCommand(
                dbCon,//连接
                new object[,] { //字段名及对应值
                    {"SettingID",100},
                    {"SettingValue","http://www.phpstudy.net"}
                },
                "Settings" //表名
            ); //new 后即执行,可用 bSuccess 与 Query 属性分别获得成功与否及相应的 SQL
 
            //这个 MySQLSelectCommand 有点让人蛋疼,还不如直接 SQL 痛快
            DataTable dt = new MySQLSelectCommand(dbCon, //连接
                new string[] { "SettingID", "SettingValue" },//要查询的字段列表
                new string[] { "Settings" }, // 要查询的表,可以多个
                new object[,] { { "SettingID", "=", 100 } },//条件
                null,
                null //后面还可以有 limit, distinct 等指令及参数
            ).Table; //获得 DataTable
 
            //更新时用这种方式还算方便
            new MySQLUpdateCommand(dbCon,
                new object[,] { { "SettingValue", "http://www.phpstudy.net" } },
                "Settings",
                new object[,] { { "SettingID", "=", 100 } },
                null
            ); //new 后即执行,可用 bSuccess 与 Query 属性分别获得成功与否及相应的 SQL
 
            //参数与 MySQLUpdateCommand 的后四个相同
            new MySQLDeleteCommand(dbCon, "Trash", null, null);



相关阅读:
详细谈谈javascript的对象
MAC系统VLC播放1080P电影卡顿的两种解决方法
Fedora 13 正式版安装教程[图文]
C#获取存储过程返回值和输出参数值的方法
如何判断php数组的维度
AngularJS ng-bind-template 指令详解
CentOS 6.3下使用Gitosis安装搭建Git Server教程
Oracle查看和修改连接数(进程/会话/并发等等)
php中 ob_start等函数截取标准输出的方法
Discuz7.2版的faq.php SQL注入漏洞分析
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Cocos2d-x中实现弹出对话框示例
JavaScript函数柯里化详解
Android中的android:layout_weight使用详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 宣化-黄石 金寨-武汉 淮南-绍兴 路口铺-安陆 深圳东-庐山 庄桥-苏州 豆沙关-沙沙坡 武威南-阳高 四平-武昌 庐江-巢湖 牡丹江-讷尔克气 二井-高头 丹凤-南昌 大虎山-梁山 开通-加格达奇 辽阳-邯郸东 沈阳-山城镇 闽清北-上海虹桥 韶关东-高碑店 沈阳-太谷 青州市-武穴 鱼卡-大柴旦 汨罗东-汉川 蓝村-辛集 上海-仙林 秀山-泔溪 武夷山东-南昌西 塔河-新天 新干-醴陵 汾阳-安康 鸡冠山-祁家堡 沧州-廊坊北 苏州-清河门 昂乃-小河沿 鄂尔多斯-合肥 伊敏索木-阿尔山北 涿州-绵阳 瑞安-福州 张家界-三江县 汤原-沟帮子 昌黎-杨陵 宜春-广州北 肇庆-茂名西 红果-曲靖 漯河-恩施 沧州-磁窑 镇安-渭南 厦门-镇平 新华-柴河 龙镇-秦家 新友谊-同江 合肥-武山 临汾-滁州北 临清-温州 株洲西-西安北 北京-敦化 盘锦-禹城 庐山-定西 义乌-安顺西 武胜-重庆北 东莞东-上海南 公主岭-怀化 无锡-略阳 东莞东-长春 牡丹江-禹城 贵港-梧州南 上海-吐鲁番北 平邑-嘉祥 牙拉盖图-宇宙地 井冈山-南昌西 莆田-蚌埠南 泰山-北流 酒泉-吐鲁番 秧草地-小得江 通远堡-吴家屯 宜宾-小儿坪 衡水-镇江 上饶-潢川 天水-巢湖 镇安-包头 请问从前甘肃省金昌市永昌县的北海子乡北海子村现在叫什么名字
北京到沈阳的动车组在天津有站吗
十一之前到北京的火车有吗
我在广州,能电话预订西安到广州的列车票吗
现在到齐鲁证券开个户要票价多少钱
我在滁州、怎么可以预定从吉林到宁波的列车火车票、始发站是吉林、
你好我想请问您我从广东惠州邮寄20KG的衣服到河南新乡最便
在马鞍山怎样坐车到安庆
谁可以帮我查到这个IP地址在哪个网吧113.106.212.178谢谢,
武汉到上海的船票多少钱,要多少小时
不晚点是5点左右到首都机场。能赶上北京站晚上9点的火车列车吗
我是河南鲁山的,去上海应该坐哪列列车
我有个电平车在浙江桐乡怎么寄回家呀?,如果可以 寄回家
敦煌鸣沙山三个特点
零基础学绘画厦门金榜公园附近 成人班
坐1489次列车火车从北京到佳木斯,下车后要去双鸭山,能坐什么车
芜湖去阜阳有几班火车列车和汽车,分别是什么时候
从昆山到徐州动车需要多少钱要多少小时
从杭州市的成站到上海的松江区大港镇怎样去方便些
动车票昆山到麻城北在哪里上车
从汽车客车站到邢台市第五中学怎么走
2011年春运在长春能买北京到延安的火车列车票吗 提前几天北京火
海口美兰机场到定安县怎么坐车
从四川泸州市古蔺县坐班车去广安市岳池县需要转几次车啊具
请问8月31号有从镇江到西宁的列车火车吗
请问从公交车从《龙岩技师学院》到九一南路77号公交大厦怎么坐知道的说下,谢谢
丹东有到长春的客车吗
重庆火车列车站怎样电话订票
男人喝哪种八宝茶比较好
从安德门到徐家洼,再从徐家洼到黄家圩(也就是南京火车列车站)

Copyright © 2016 phpStudy |