Colorful Life2010

.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的方式连接。。。

春暖花开了
Weather:阴天,樱花和玉兰花开了

大连的春天来得晚,来得慢,每次总是尽可能的来表现“乍暖还寒”的意境。

难得的一个周一直还不错的天气,今天周六,温度低了几度,也是小阴着天,但还是无法再阻挡人们出门踏青的想往。

4月了,大连春游的时间到了。看,连窗外的桃花都开了……

IMG_4006

 

第一站,劳动公园。

 IMG_3971
孔雀很给面子,我们到了之后,两只白的一只绿的,相应的开屏;有个有意思的小插曲,人群中竟然有人在说是孔雀要打架了;晕,还有不知道孔雀为什么要开屏的……

 

IMG_4016

满树的樱花已经开满了枝头,樱花最漂亮的,是她开始飘落的时候……

 

再来一张比较有喜感的。

IMG_4027

Python中的正则表达式入门(1)
Weather:阴天,樱花和玉兰花开了
  • ^ 匹配字符串的开始。
  • $ 匹配字符串的结尾。
  • \b 匹配一个单词的边界。
  • \d 匹配任意数字。
  • \D 匹配任意非数字字符。
  • x? 匹配一个可选的x字符(换句话说,它匹配1次或者0次x 字符)。
  • x* 匹配0次或者多次x字符。
  • x+匹配1次或者多次x字符。
  • x{n,m} 匹配x字符,至少n次,至多m次。
  • (a|b|c)要么匹配a,要么匹配b,要么匹配c
  • (x) 一般情况下表示一个记忆组(remembered group). 你可以利用re.search函数返回对象的groups()函数获取它的值。
PYTHON实现阶乘算法
Weather:忘了啥了,反正挺舒服

今天看到FoxPro的一道题,要写出P = N!的程序及结果,这不就是个求阶乘吗?

一般程序弄个双循环就可以了,不过PYTHON就比较方便,循环一次就可以了。

  def f(n):
    c = 1
    for i in range(n+1):
        c  *= i
    return c

或者是用递归的方法也比较方便。

def f(n):
 if n > 1:
  return n*f(n-1)
 else:
  return 1



def f(n):
 p = 1
 if n > 1:
  p = n*f(n-1)
 return p

再后来一想,PYTHON有lambda方法,会不会有更好的方法,于是reduce方法,一句话搞定阶乘。

用PYTHON的reduce方法

def foo(n):
    return reduce(lambda x,y: x*y, range(1,n+1)

用VBA实现EXCEL单元格输入即保护功能
Weather:春天来了,百花还未花

由于Tracy要求财务上用的EXCEL表要实现的功能:当前SHEET页上的某些单元格或行或列,录入数据的人,只有录入一次,录入完则立即保护起来,如果想修改,只能有密码的人才能修改。

从这可以衍生出更具体的要求:

  1. 输入一次即保护起来,想再修改必须输入密码(即原始要求)
  2. 未输入的空白区(保护作用区,即将会被保护的)可以随便操作
  3. 输入密码后,只能修改当前选中的单元格,不能随意修改其它被保护的单元格
  4. 要修改被保护的单元格,弹出输入密码框
  5. 输入密码验证后,拉选(多选)单元格区域,被保护的还是不能被删除
  6. 被保护起来的单元格要特殊显示
  7. 保护状态下,拉选(多选)时不会触发密码提示框