WCF利用MySql Connector Net连接mysql数据库

由于某小项目的需要,又和WCF杠上了,因为这次使用mysql作为数据库,所以中间又出了点岔子,特此记下,主要是记住中间的解决过程。

项目环境:WCF +NET4.0+MYSQL5.1+MySql Connector Net 6.6.5

服务器环境:windows service 2008 R2 SP1 Standard *64+IIS7

测试过程:

由于服务器上没有装mysql的界面化控制软件,然后最近本科课程正在学习数据库,所以这次直接就在命令行下使用sql语句进行了。

找某人要了mysql的root密码,进入后台,简单的创建了一个数据库,并创建了一个test表,里面就2个字段,myID和myName。

然后本机下进行测试,将自己的简易版sqlHelper改装下,就可以直接访问mysql,简单到。。。。添加应用,改下using,然后在原来的sqlCon等定义前面加上“My”2个字母就搞定了。。。。sqldbtype除外。

然后测试连接,wcf项目下测试,因为是调试模式,所以,错误信息一目了然。。。连不上,提示错误是root只能在localhost下使用,然后联想到现在在上的,数据库安全方面的知识,好吧,只能去建立一个可以外网访问的账号。一番捣鼓后,成功连接,但是在sql语句部分又出现错误。

我的sql语句:SELECT * FROM [test];

明明都设置好了,却提示我有错误,在test附近,不理解,这样的单表查询语句我写的多了,怎么可能错了呢。但是它说test附近错误,抱着试试的态度把[]给去掉了——连接正常。这里,我想应该是不同的数据库对sql语句要求不同吧。因为最早的一次,在mssql下建立user表,必须加[]才能正常访问,而平时加[]不影响,且可以告诉我自己这是一个表,所以我就习惯的在所有表名的地方都加上了[],没想到这次居然错在了这个地方。

既然连接远程数据库成功,那么下面就简单了,将wcf部署到服务器就可以了。

按照以往的步骤部署了下,因为知道.net版本必须选对,故选择4.0的版本,设置完成后,服务器本地打开服务成功。但是,我在本机上,却怎么打不开,返回错误。百度后知道了是没有开放浏览目录的权限,因为以前都是在iis6下操作,一时间7还不熟悉,这里又百度了下,好在网友的力量巨大,成功设置,也成功的得到了服务页面。

然后本地建立winform应用,添加服务后,开始测试。但是。。。返回错误。。。不知道什么原因。所以在wcf的代码中加入error输出到本地txt文件的操作,但是仍然不行,客户端得不到错误,服务端也没有输出错误。

再次修改,在wcf中,设置允许异常调试,在服务类,即继承服务接口的类定义上加上:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
 public class Service1 : IService1     {

这样就可以在返回的地方看到错误的最上面一条信息。。。。。根据返回的信息,说是路径不可以用,访问被拒绝:Access to path “D:\***\log.txt” is denied.

这个地方没有意识到原因,删除日志输入的再调试,返回的是:Object reference not set to an instance of an object(对象没有实例化。)

看到这个我也迷惑了,按说我的catch捕获了这个异常,应该接着返回error字符串给我啊,但是却返回了异常信息,有些不是很理解。百度也没有头绪后,想到不允许写日志,应该是应用程序的权限不足,我便可耻的,将那个文件夹的权限改成了所有人都可以完全操作。。。虽然这样很危险,但是我还是干了,为了看到错误的堆栈信息。

更改后,发现了错误原因,在new Conn的时候就出错了,因为。。。。未能加载dll文件。。。然后我才想起来,本机有MySql Connector Net 6.6.5,而数据库没有,居然犯了这样一个错误,无语。

很快的MySql Connector Net 6.6.5装上后,又抛出另外一个异常,连接字段用的root账号登陆,而root只能是localhost,但是,这里登陆是使用host确实机器名,所以无奈,使用了自己的对所有ip均开放的一个账号登陆,然后一切正常。至此,demo搞定

********************************分隔线********************************

小结:

首先大赞下C#连接数据库的方便,各种api,各种库,包括上次测试连接oracle数据库,但是得注意dll版本的问题。也就是环境的部署啦

第一次使用mysql client去进行数据库的管理,以前用mssql的企业管理器用习惯了,导致很多命令不知道,各种百度

前段时间写安卓的http,然后最近调试自己的安卓访问wcf代码,知道了调用wcf貌似就是http做底层连接,然后post数据吧,post数据体里面,是一个soap的xml类型数据,各种节点。如此想来,winfrom.net,访问wcf返回得到类,应该也就是根据xml反序列化去实例化类。当初觉得好神奇啊= =现在觉得= =ms好方便。。。。。

如此看来,WCF岂不是php做web service的时候的一个包装?基础地址+函数代表各个接口地址,然后post数据。只不过,中间的细节,都给wcf给封装起来了,让用户看起来,就像是在调用一个个的函数,就像是本地调用只不过加上一个client(就winform来看)。而在安卓方面,如果底层封好,也就看成一个函数的调用,只不过,是需要网络连接,以及可能比较耗费时间的函数调用。

标签