码迷,mamicode.com
首页 > 数据库 > 详细

C#DB2开发问题随记

时间:2015-11-25 21:13:36      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

最近公司有个小工具需要用到DB2数据库,以前没玩过DB2,觉得应该很容易就实现了。

这个小工具最开始用了Nhibernate来连接DB2,Nhibernate也是第一次用。。实在是惭愧啊。。。

第一次用DB2,查了半天资料说DB2的控制中心有UI可以输入SQL命令,结果。。控制中心没连上。。一直报错。

当然,我起初是不知道这是怎么回事。还以为我装的DB2数据库有问题。实际上,不是。是我没去配置中心去配置它的IP,导致不能连接。

第一次用的同学可以网上搜一下当控制中心连接不上时报错的信息(最开始内心是崩溃的),会有告诉你怎么去配置的文章。

控制中心连接数据库界面如下。打圈的地方就是执行SQL命令的地方

技术分享

经过网上查询资料,Nhibernate连接DB2的用法,什么映射文件要编译为嵌入的资源,配置文件要加上什么<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2"> 等等。(具体略。。了解也不是很清楚,需要的可以网上查查)

最后查出了连接DB2,要用IBM.Data.DB2.dll。最开始我装的DB2都是64位,用Nhibernate连接DB2,运行程序,居然报格式不匹配(反正就是位数不对的错误。应该用32位的dll)。记得公司程序都编译为x86,所以我就重装了DB2 X86版本,然后引用的是X86的IBM.Data.DB2.dll。

然后继续运行程序,程序又报错:System.InvalidOperationException: SQL1159  Initialization error with DB2 .NET Data Provider, reason code 2, tokens C:\Users\Administrator\Desktop\Test\Test\bin\db2app.dll

通过网上搜索解决方案是找到db2app.dll,然后拷贝到bin目录下。  因为它不能加入到GAC中,也不能引用。

拷贝db2app.dll到bin目录后,一运行,嘿,程序正常了。

然后准备收工,Release程序给QA。然后问题又出现了。。

db2app.dll必须在bin目录下,而且还不能改变bin的文件夹名,一改又报错。例  c:\bin\我写的程序文件夹(具体exe在这里面) db2ap.dll。 

作为一个coder这让我觉得这个目录结构太难看了,哪里有exe还必须在bin目录下。

然后又尝试在百度,在google搜索,一天过去了,,,还是没找到对策。

在这期间发现如果我用OleDB 连DB2,完全不需要db2app.dll。因为之前经理说过要用Nhibernate来连接,我就不能轻易改实现方式。

最后在下班时间给经理说,这个如果要保留bin目录,那程序算完了,如果不保留,目前就只有改为OLE DB方式来处理了,中间的操作SQL都我自己来写。

因为工具小,所以SQL也不多。经过经理同意,我就开始用OLEDB方式了。

以前都没用过OLEDB方式,随便在网上找了个连接字符串,写在配置文件里。然后开始写代码。。

connectionString="Provider=IBMDADB2;Database=192.168.0.5:50000;Data Source=mydb;PWD=guosange;UID=guosange

很快,程序又写完了,,然后开始测试。。想测试一下我乱改一下IP,看报什么错。

结果随意改掉IP,甚至删掉IP,程序异常不报错,正常运行。。经过又是一段时间测试,分析。。发现,我必须在DB2的控制中心,连接上DB2,并且连接字符串中的DataSource必需为数据库昵称。。。不然连上不。。

基础差啊。。。之前一直用ADO.net连接数据库,以为这个OLEDB也算ADO,,结果,,(所以全同学们,要想爬得高,基础要打牢啊)

值得一提的是,这个OLEDB连接数据库,IBM.Data.DB2.dll也可以不要。

 

这样,又让我为难了。。。难道让客户用这个工具,你还得让他先用控制中心连接数据库,搞好昵称,,然后再去配置文件里改配置吗。。 那可不行。

然后我就又搜索ADO连接,发现原来IBM.Data.DB2.dll这个dll就是用来ADO连接的。。。然后又引用IBM.Data.DB2.dll,修改代码,编译,运行,出错。。

出错原因还是bin目录下没有db2app.dll(之前改为OLEDB已删)。

 

我又惆怅了。。。难道必须用OLEDB吗,,又试了很久,又是依然不能解决。。。心里一直骂,用啥DB2.。。。

经过强烈思想斗争,觉得,感觉解决无望,觉得还是用OLEDB算了。毕竟看起来比多了一个bin目录好些。。

编译,发布,完工。

 

顺便打开一个2008,看网上好多用DB2程序都是vs2005和.net 2.0组合写的,我本机最低版是vs2008,将就用吧。。

建立解决方案,选择.net版本为2.0, 引用IBM.Data.DB2.dll,写了段ADO连接DB2代码

 string connectionString = "Server=192.168.0.5:50000;DataBase=mydb;UID=guosange;PWD=guosange";
            string commandtext = "select count(*) from testTable";
            using (IBM.Data.DB2.DB2Connection connection = new IBM.Data.DB2.DB2Connection(connectionString))
            {
                connection.Open();
                IBM.Data.DB2.DB2Command command = new IBM.Data.DB2.DB2Command(commandtext, connection);
                IBM.Data.DB2.DB2DataAdapter adapter = new IBM.Data.DB2.DB2DataAdapter(command);
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                connection.Close();
            }

 

执行。。。依然提示需要db2app.dll。  觉得无望了。。

 

关闭之前,想想引用一个64位IBM.Data.DB2.dll试试看,看看报什么错。。编译,执行。。结果。。TND居然成功了。。

我程序一直编译为x86.。。。我操作系统为win7 x64。。。 但是经验告诉我它应该报错才对啊。。。但实际上却没有报错。。。我糊涂了。。

 

原因我确实不知道。。。但结果就这样。。。

然后赶紧修改代码,改为ADO连接DB2,编译,生成,测试。发布。。

为了验证,我特意装了个虚拟机,装上32位xp,装上.net2.0 运行报错。。

System.TypeLoadException: Could not load type ‘System.DateTimeOffset‘ from assembly ‘mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089‘.

 

解决办法:需打上Microsoft .NET Framework 2.0 Service Pack 1 (x86)补丁,下载地址:

 

http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=79bc3b77-e02c-4ad3-aacf-a7633f706ba5

 

 

打上补丁后,运行正常。

赶紧又把代码找出,修改,编译,生成,测试。发布。

 

总结:ADO连接DB2,需要IBM.Data.DB2.dll。  OLEDB不需要。。但是要配置控制中心的数据库实例连接。

如果报错System.InvalidOperationException: SQL1159  Initialization error with DB2 .NET Data Provider, reason code 2

那有可能是缺少db2app.dll。拷贝复制到bin目录下即可。

由于程序原因,请选好IBM.Data.DB2.dll的版本。出了问题一定要多查资料,多测试。

C#DB2开发问题随记

标签:

原文地址:http://www.cnblogs.com/guosange/p/4995553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!