设为首页 收藏本站
查看: 1191|回复: 0

[经验分享] C#DB2开发问题随记

[复制链接]

尚未签到

发表于 2016-11-18 09:10:49 | 显示全部楼层 |阅读模式
  最近公司有个小工具需要用到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的版本。出了问题一定要多查资料,多测试。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301936-1-1.html 上篇帖子: DB2 数据类型转换 下篇帖子: db2 monitor event
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表