Colorful Life2010

DB2(as400)数据分页SQL
Weather:None

方法1:

利用DB2自带(ORACLE一样)的”ROWNUMBER() OVER(ORDER BY sort-key)”函数来完成,用法如下

select * from (select rownumber() over(order by sortkey1 asc,sortkey2 desc,…) as rownumber_,* from dbname1 order by sortkey1 asc,sortkey2 desc) as temp_db where rownumber_ between ?start+1 and ?end

这种方法由于是DB2自带的,相对来说大量数据的时候效率可能会好点(待求证),但如果是查询的表比较多和条件比较多的时候感觉会有点混乱,容易出错.

 

方法2:

之前用过MSSQL的那种取出前一部分的最大ID然后再取比这个ID大的相对的page size数量的数量,这个方法比较通用一些,但问题是同样组装比较复杂,当然你可以弄到PROC里面,二是这个方法数据量很大的情况下,越往后的分页效率越低,并且效率变化很明显.

 

方法3:

使用”FETCH FIRST ?pagesize ROWS ONLY”,用法如下

select * from dbname1 where key not in(select key from dbname1 FETCH FIRST (page-1)*pagesize ROWS ONLY) FETCH FIRST pagesize ROWS ONLY

这种方法的效率现在还无从考证,但这种方法比较容易组装SQL,因为分页的部分虽然字符比较多,但全放在了条件语句后面.

 

综合三种方法,第二种需要一个排列的KEY,这样的条件,对于AS400里的DB2比较麻烦,因为我操作过的很多表,其实里面是没有用于排序的KEY甚至是没有KEY的,AS400采用自己的游标(类似一个内部的ID)来知道当前是第几条数据.第一第三种方法在KEY这方面相对好一些,但还不是太完美.

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

《DSPF~显示文件的常用操作码学习》(转)
Weather:晴れ、5~15℃、東風4m/s

CHECK(检验)

根据所指定的参数不同,用此键字可完成以下功能:
功能                              有效参数值
有效性检验                       AB,ME,MF,M10,M11,M11F,VN,VNE
键盘控制                          ER,FE,LC,RB,RZ
光标控制                          RL,RLTB


键盘控制码                         含义
ER                                    记录结束,等价于AUTO(RA)
FE                                    字段退出检验
LC                                    小写,等价于LOWER
RB                                    右对齐,空格填充;等价于AUTO(RAB)
RZ                                    右对齐,零填充;等价于AUTO(RAZ)....

如何从PC 传送 SAVF 到AS/400
Weather:いい天気

如何从PC 传送 SAVF 到AS/400
解答 在Windows中启动DOS窗口:

1. FTP AS400-IP 地址
2. 输入用户名, 回车, 再输入口令.
3. CD /qsys.lib/***.lib, *** 为AS/400 存放SAVF库名.
4. LCD PC 机本地存放SAVF的目录
5. BIN
6. QUOTE SITE NA 1
7. PUT pcSAVF.savf asSAVF.savf , 其中: pcSAVF 为 PC 中SAVF 文件名;asSAVF 为AS/400中文件名.
8. QUIT

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

目前状态:

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

思路是这样的:

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

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