参考:MySQL的使用 MySQL 5.0.24a + ByteFX.Data 0.76,里面提到的两个问题,在5.0.27下面不需要再处理。
另外,使用MySQL 5.0.27 + MySQL .Net Connector 5.0.2 beta需要注意的地方,就是参数标志符号为?,而不是@。例如:select * from TblUser where UserID=?UID。在MySQL的使用 MySQL 5.0.24a + ByteFX.Data 0.76中参数标志符号使用的就是@。
因为想用MySQL写点东西,要在Enterprise Library的Data Access Application Block基础上加上MySQL支持,所以看了下MySQL以及MySql .Net Connector一些主要方面的用法。
存储过程
在test库里面建立测试表:
在MySQL Administrator的GUI工具里面,在User Administration里为当前操作的用户添加对test和系统库mysql的权限,让用户能创建存储过程。
如果是在命令行或者是Query Browser创建存储过程,执行下面的语句:
1. DELIMITER //语句。MySQL的多个SQL语句/命令之间,默认使用;隔开,存储过程的body里面也要使用;将多个语句分隔开,这样,如果MySQL将创建存储过程的SQL语句使用;分隔,然后一个一个执行,就会有语法错误,无法创建存储过程。因此我们先使用DELIMITER关键字,将默认的分隔符修改为//(也可以是其它你认为合适的字符,例如?等),这样MySQL才会将存储过程的创建语句当作一个完整的SQL语句执行。
2. 参数。参数名是不需要使用参数标志符号的,例如上面的例子,UC、UN两个参数名前面并没有加上参数标志符号?,如果加上参数标志符号会报语法错误。因为参数名不需要使用参数标志符号,因此注意参数名字别跟表的字段名字重名。
3. 详细的语法,参考MySQL官方文档。一些摘选的SQL语法如下:
MySQL里面执行存储过程的语法为call StoredProcedureName ('参数1','参数2'),例如调用上面的存储过程为:
在Enterprise Library Data Access Application Block里面,提供这样的方式调用存储过程:
不管怎样,按照MS的推荐方式使用是一种好的选择,因此在DAAB实现MySqlDatabase时也保持这样一种机制,这样就需要在MySQL中获取存储过程的参数列表。这点跟Oracle、Sql Server的ADO.Net驱动完全一样,使用MySqlCommandBuilder.DeriveParameters(MySqlCommand command)方法实现。
下面的方法是我自己写的一段取存储过程参数名称列表的实现方法,只是一种尝试。MySqlCommandBuilder的DeriveParameters方法是通过调用MySQL接口完成的,并且会填充参数的Direction、Size、Scale等属性。
MySQL里面存储过程信息保存在mysql数据库的proc表里面,param_list字段为参数列表:
DataSet Update
上面建的表TblUser中有一个自增类型的字段,为了简化DataSet Update的测试,建立了另外一个测试表TblItem:
DataSet Update的测试代码如下,整个代码跟Sql Server数据库写法上没有差别。测试过程中一开始在调用adapter.Update()方法后稍微停滞一段时间,然后出现一个"Server shutdown in progress"异常,把MySql的一些内存Buffer适当调大一些,重起MySql服务再进行测试就OK了。
有了上面这些了解,就可以从Enterprise Library Data Access Application Block的Database类继承,实现一个MySqlDatabase类了,并且非常简单。