吵吵   2014-06-07  阅读:3,374

今天研究了一天的Oracle数据库,尝试着如何去用c#读写Oracle数据库,没想到的是,原本以为很简单的东西,研究了整整一天。

前几天一直在和金域和LIS的开发商谈金域接口的事情,难点在于LIS开发商做这个接口要支付额外的费用,将这个事情提交医院,因为医院明年考虑整体换成东软的系统,不愿意再投入。这个时候金域跑出来了,他们愿意出这个钱,前提就是LIS开发商和他们的客户有足够多的交集。

就在我每天纠结这个事情怎么办的时候,我突然发现自己又钻入牛角尖了。我干嘛非要LIS开发商来做这个接口呢,他做了也无非就是将金域的报告集成到他们的报告查询系统中去。这个事情其实自己也可以做,集成不了,就做一个独立的查询程序了!如果再和他们这个绕,我自己都会被绕进去了,所以有时候跳跃性思维也很重要。

那就先研究怎么把金域回传的结果写入Oracel数据库,即我们的HIS吧。

1、网上一搜,很简单啊,用System.data.OracleClient命名空间里面的OracleConnection就可以了。

2、于是乎写上using System.data.OracleClient,尼玛,找不到啊!

3、继续百度之,原来微软在.net 4.0版本后,已经不再维护OracleClient了,如果要用需要到Oracle官网去下载ODAC组建。

4、于是乎去下载去吧。上次想下载的jdk因为很慢没有下载,希望这次能够快点。尼玛!!还要注册才能下载。

5、这网速,放弃。回头去VS2010里面去吧.net 4.0 改成了3.5,你不是说4以后没了么,3.5总有吧,失败,引用里面还是找不到!

6、继续百度之,原来要从文件引用,从.net里面是没有的。解决方案上->引用->添加引用,然后在文件夹C:\Windows\Microsoft.NET\Framework\v2.0.50727下就可以找到System.Data.OracleClient.dll,点击确定,就OK了。

OracleConnection

这下总可以用了吧,其实噩耗才开始:

插入一个数据看看,中文乱码!

什么解决方案呢?

1、修改oracle数据库以及客户端的字符集(select userenv(‘language’) from dual;),一看数据的字符集AMERICAN_AMERICA.us7ascii,再去看本地电脑上注册表里面Oracle下的NLS_LANG还是AMERICAN_AMERICA.us7ascii啊,这两个一样呢,照样乱码,不过为什么乱码倒是知道了,c#是unicode编码的。

2、通过C#自带的函数设置环境变量
System.Environment.SetEnvironmentVarible(“NLS_LANG “,” SIMPLIFIED CHINESE_CHINA.ZHS16GBK”);

照样不行!

3、网上找的,用OracleParameter来格式化一下中文,别提了,是一样不行的。

眼看一天就要过去了,不甘心啊,这个问题都没有解决掉。

终极杀招,好吧,你赢了,用using System.Data.OleDb;

conn = new OleDbConnection(@”Provider=MSDAORA.1;User ID=xxx;Password=xxx;Data Source=dbserver;Persist Security Info=False”);

真的不乱码了哦,哪怕是你用Provider=’OraOleDb.Oracle’都会乱码,话说微软早先做的OleDbConnection充分考虑了字符集的问题,比Oracle官方都做的好啊?

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

3条回应:“坑爹的OracleClient”

  1. HUANG说道:

    楼主,创建.NET4.0往往就是.NET4.0 Client Profile,这样你肯定找不到System.Data.OracleClient.dll,手动改下项目属性为.NET 4.0就可以引用了。至于Oracle英文字符集就是个讨厌的东西,不过以前很多老系统都用这个字符集,改为ODBC连接呗, 一了百了!

  2. HUANG说道:

    楼主不会是南医大检验科的吧?

  3. 清子今说道:

    我是东软的,最后使用我们的系统了没有呢??

发表评论

电子邮件地址不会被公开。 必填项已用*标注