[编辑2:下面的答案中的更多信息和调试...]
我正在编写一个 python 脚本来将 MS Access 数据库导出到一系列文本文件中,以实现更有意义的版本控制(我知道 - 为什么是 Access?为什么我不使用现有的解决方案?假设限制不是技术性质)。
我已经通过 comtypes 库使用 ADO 和 ADOX 成功导出了数据库的全部内容和结构,但是我在重新导入数据时遇到了问题。
我将每个表的内容导出到一个文本文件中,每行都有一个列表,如下所示:
[-9, u'No reply']
[1, u'My home is as clean and comfortable as I want']
[2, u'My home could be more clean or comfortable than it is']
[3, u'My home is not at all clean or comfortable']
以及导入所述文件的以下功能:
import os
import sys
import datetime
import comtypes.client as client
from ADOconsts import *
from access_consts import *
class Db:
def create_table_contents(self, verbosity = 0):
conn = client.CreateObject("ADODB.Connection")
rs = client.CreateObject("ADODB.Recordset")
conn.ConnectionString = self.new_con_string
conn.Open()
for fname in os.listdir(self.file_path):
if fname.startswith("Table_"):
tname = fname[6:-4]
if verbosity > 0:
print "Filling table %s." % tname
conn.Execute("DELETE * FROM [%s];" % tname)
rs.Open("SELECT * FROM [%s];" % tname, conn,
adOpenDynamic, adLockOptimistic)
f = open(self.file_path + os.path.sep + fname, "r")
data = f.readline()
print repr(data)
while data != '':
data = eval(data.strip())
print data[0]
print rs.Fields.Count
rs.AddNew()
for i in range(rs.Fields.Count):
if verbosity > 1:
print "Into field %s (type %s) insert value %s." % (
rs.Fields[i].Name, str(rs.Fields[i].Type),
data[i])
rs.Fields[i].Value = data[i]
data = f.readline()
print repr(data)
rs.Update()
rs.Close()
conn.Close()
除了数值(双精度和整数)被插入为零外,一切正常。关于问题出在我的代码、eval、comtypes 还是 ADO 的任何想法?
编辑:我已经解决了插入数字的问题 - 将它们转换为字符串(!)似乎解决了双精度和整数字段的问题。
但是,我现在有一个不同的问题,以前被上述内容所掩盖:每行中的第一个字段被设置为 0,无论数据类型如何......有什么想法吗?