标签:
最近公司有个小工具需要用到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的版本。出了问题一定要多查资料,多测试。
标签:
原文地址:http://www.cnblogs.com/guosange/p/4995553.html