Colorful Life2010

Tag: Access | 记录数: 4
PythonでMDBのデータをSQLiteに移動してみる

Access2000のMDBファイルのloto6のデータをSQLiteに移動してみます。ただMDBのデータ取得だけでは何なので、loto6 のデータを使ってみました。

# encoding: cp932
import win32com.client
import sqlite3

MDB_NAME = r"loto.mdb"
SQLITE_NAME = r"loto.lit"

PythonでAccessデータベース(*.mdb)にテーブルを追加する

テーブルの追加は、ADOXを使ってできますが、ADOからSQLを発行した方が楽なので、そちらで。テーブルの存在確認をしたかったので、これは ADOXで行っています。

#!c:/Python25/python.exe -u
# encoding: cp932

import win32com.client

MDB_NAME = r"test.mdb"
PASSWORD = "pass"
TABLE_NAME = u"テーブル"

PythonでAccessデータベース(*.mdb)を作成する

ADOXを使用して、Accessのデータベース(*.mdb)を作成します。私が知るたいがいのWindows(Windows XPと言うものです)では標準で使えるので、インストールなしにデータベースを使用したい場合に便利です(Accessをインストールしていなくても使えるわけで)。前にVBScriptで作ったもののPython版。

#!c:/Python25/python.exe -u
# encoding: cp932

import win32com.client

MDB_NAME = r"test.mdb"
PASSWORD = "pass"

cat = win32com.client.Dispatch("ADOX.Catalog")
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;\
    Jet OLEDB:Database Password=%s;" % (MDB_NAME,PASSWORD)
cat.Create(ConnectionString)

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