77家的会客2010

Tag: .NET | 记录数: 7
.NET连接AS400出现[Safe handle has been closed]错误
Weather:凌晨惊雷,早上大雪,4月15日的恐怖天气

最近在做一个工具,要用.net winform通过IBM.Data.DB2.iSeries(IBM DB2 UDB for iSeries .NET Provider)来连接AS/400服务器进行操作,由于IBM提供的这个工具,是基于Client Access的并且针对.Net2.0的这个工具,实现上在调用AS/400的命令的时候,相当于是通过类似连接数据库来执行一个存储过程的command一样的方式进行的。

一切功能都很好用,现在问题出现在了一个不影响软件使用的条件下,即在进行了一个或一系列操作(有连接AS/400,哪怕故意输错连接口令,连接不上)的情况下,在winform关闭的时候,程序会弹出错误”Safe handle has been closed”。

System.ObjectDisposedException はハンドルされませんでした。
Message=”セーフ ハンドルは閉じられています。”
Source=”mscorlib”
ObjectName=”"
StackTrace:
場所 System.Runtime.InteropServices.SafeHandle.DangerousRelease()
場所 System.Threading.RegisteredWaitHandleSafe.Finalize()

起初,一直以为是自己的程序里重复关闭数据库连接之类的导致的,在仔细查找了代码并且加try…catch测试之后发现,根本不是我程序的问题,因为换了cwbx.dll方式来调用的话,是不会出这个错的,于是上网搜索,CSDN里有人提问过同样的问题,但最后也没说是如何解决的甚至是有没有解决;于是转战英文+日文的搜索,终于在一个日本語ブログ和一个英文BLOG里找到了这个问题的说明,原来是IBM的Client Access的BUG,装上相应的补丁包就可以了。

狠击这里可以下到相应的版本的Client Access的补丁。

装上补丁以后,就会得到一个版本更新的IBM.Data.DB2.iSeries.dll文件,就不会再出现标题内的错误了;另外,cwbx.dll的版本也会被更新。

测试证明,如果把AS400成当一个DB2服务器来用,用IBM.Data.DB2.iSeries.dll是个非常不错的选择,包括可以很好的支持存储过程的调用等;但是如果要从Client(winApp,Web)调用在AS400上编写(COBOL,RPG,CL等)的程序或是直接执行AS400的 CL命令,还是推荐使用CWBX.DLL,可以很好的处理所传的变量 类型及返回结果(包括出力参数,这一点上,前者做得非常差)。当然,如果你愿意,还是可以采用ODBC或OLEDB的方式连接。。。

远程自动添加AS400路由网关
Weather:いい天気

目前状态:

一台内网的AS400服务器,想要在远程访问(即外网或内网其它网段),这样就可以实现分布式开发,并且即用即改,安全性方面也能得到一些保证.

思路是这样的:

外网对内网的AS400访问,只要在路由器上设置23号端口的转发就可以了,但是对于AS400本身,还要设置客户端(要连接400的外网客户)的网段的访问权限.

于是我们在AS400上写一个CL程序,进行400上路由及网关设置,然后再在内网开一个WEB服务器对外网开放(可以在任何地方访问得到),通过WEB服务器上的程序,来调用400上的这个CL程序,以达到能自动更改的目的.

N3C开发记事本
Weather:阴天,在家窝一天

先解释下什么是N3C,是我为我的网站新版定的代码,这个代号从最初的NEW3RGB变成后来的N3,再后来就演变成了N3C,怎么理解呢?从第一 个名字理解也可以,也可以理解成.net版或是用了nhibernate的3rgb新版了,所以new new nhibernate三个n,随便选。而为啥叫3C呢?3可以理解成我柠檬网站重要版本的第3版,也可以和后面的C一起理解为3 color,也就是RGB了。

好了,名字就不废话太多了,新版的开发从年初说到年尾才开始,其实也就到今天(2008/11/22)也就写了不到两周,但是从今天开始记录一些开发中的东西,而这篇日志一直处于隐藏状态,直到你看到这一版程序发布的时候了。

N3C采用.net2.0,NHibernate2,SQLite3为基础,开发工具VS2008,采用log4net记录日志,至于分层不分层已经由NHibernate决定了,能不分吗?

前台最重要的还是和前一版本一样,采用jQuery,大多的前台数据ajax操作及一些动态效果,都是用他的功劳了。

.NET调用AS/400上的程序(.NET CALL AS/400 PGM)
Weather:晴转阴,东北风5-6级转西北风5-6级,(-5~-2)℃

.NET连接AS/400有以下几种方式

  1. OLEDB(CA)
  2. ODBC(CA)
  3. IBM.Data.DB2.iSeries(CA*)
  4. CWBX(CA*)

后面标有(CA)说明,这四种连接方式都是基于CLIENT ACCESS的,而后面两种,其实只是需要CA装完后提取出两个相应的DLL就可以了,前两种则得依赖系统安装CA进行驱动支持。

几种连接方式能进行的操作也是各有区别的

System.Data.Sqlite 上手指南

 

System.Data.Sqlite入手。。。
首先import/using:

 
代码
  1. using System.Data.SQLite;  

Connection和Command:

代码
  1. private SQLiteConnection conn;  
  2. private SQLiteCommand cmd;