I'm trying to transfer an access database table to Postgres.
I have created a Postgres table with the same fields as the access
database.
I'm attempting to use the fields read from the access db to set up
parameters for insert into the Postgres db.
I get the error and traceback shown below.
Any suggestions on how to do this? Thanks.
#### code fragment
srcRs = win32com.client.Dispatch(r'ADODB.Recordset')
srcStmt = 'Select * from [%s]' % srcTable
srcRs.Open(srcStmt,srcConn,1,3)
srcRs.MoveFirst()
dstStmt = dstStmt + ')'
dstCmd = win32com.client.Dispatch(r'ADODB.Command')
dstCmd.ActiveConnection = dstConn
dstCmd.Prepared = 1
dstCmd.CommandType = win32com.client.constants.adCmdText
dstCmd.CommandTimeout = 20
dstCmd.CommandText = dstStmtv
dstCmd.Execute(RecordsAffected=pythoncom.Empty,
Parameters=parms,Options=win32com.client.constants.adCmdText)
parms = []
for ff in srcRs.Fields:
parms.append(ff)
dstCmd.Execute(RecordsAffected=pythoncom.Empty,Parameters=parms,Options=win32com.client.constants.adCmdText)
########### Error on Execute()
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "E:\FoodBank\PyTools\adoXferJet2Sql.py", line 103, in ?
stmt,count = xfer.xferTable(table,srcConn,dstConn)
File "E:\FoodBank\PyTools\adoXferJet2Sql.py", line 90, in xferTable
dstCmd.Execute(RecordsAffected=pythoncom.Empty,Parameters=parms,Options=win32com.client.constants.adCmdText)
File
"E:\Python21\win32com\gen_py\EF53050B-882E-4776-B643-EDA472E8E3F2x0x2x7.py",
line 1746, in Execute
return self._ApplyTypes_(0x5, 1, (9, 0), ((16396, 18), (16396, 17),
(3, 49)), 'Execute',
'{00000556-0000-0010-8000-00AA006D2EA4}',RecordsAffected, Parameters,
Options)
File "E:\Python21\win32com\client\__init__.py", line 343, in
_ApplyTypes_
return self._get_good_object_(apply(self._oleobj_.InvokeTypes,
(dispid, 0, wFlags, retType, argTypes) + args), user, resultCLSID)
com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft OLE DB
Provider for ODBC Drivers', 'Error while executing the query;\nERROR:
array_in: Need to specify dimension', None, 0, -2147467259), None)
################# Full test Source code
rcsHeader = "$Header:
/home/cvsroot/home/craig/swCommunityMinistry/winPyTools/adoXferJet2Sql.py,v
1.5 2001/12/27 17:21:02 craig Exp $"
# execfile("E:\\FoodBank\\PyTools\\adoXferJet2Sql.py")
import win32com.client
import pythoncom
def sqlName( nameStr ):
ss = nameStr.replace(" ","_")
ss = ss.replace("#","Num")
return ss
class AdoXferJet2Sql:
def __init__(self):
self.jetPath = None
self.jetDsn = None
self.jetConn = None
self.tableList = []
self.odbcDsn = None
self.odbcConn = None
return
def setupJetSrc( self,jetPath ):
self.jetPath = jetPath
self.jetDsn = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=' +
self.jetPath
self.jetConn = win32com.client.Dispatch(r'ADODB.Connection')
self.jetConn.Open(self.jetDsn)
catalog = win32com.client.Dispatch('ADOX.Catalog')
catalog.SetActiveConnection(self.jetConn)
self.tableList = []
for table in catalog.Tables:
if table.Type == 'TABLE':
self.tableList.append(table.Name)
return self.jetConn,self.tableList
def setupOdbcDest( self,odbcDsn ):
self.odbcDsn=odbcDsn
self.odbcConn = win32com.client.Dispatch(r'ADODB.Connection')
self.odbcConn.Open(self.odbcDsn)
return self.odbcConn
def xferTable(self,srcTable,srcConn,dstConn):
srcFields = []
srcRs = win32com.client.Dispatch(r'ADODB.Recordset')
srcStmt = 'Select * from [%s]' % srcTable
srcRs.Open(srcStmt,srcConn,1,3)
if srcRs.EOF:
print "AdoXferJet2Sql.xferTable() no rows in table", srcTable
return
srcRs.MoveFirst()
srcFields = []
for ff in srcRs.Fields:
srcFields.append(ff.Name)
dstFields = []
for ff in srcFields:
dstFields.append(sqlName(ff))
## dstParms = []
## for ff in srcRs.Fields:
## newParm = win32com.client.Dispatch(r'ADODB.Parameter')
## newParm.Direction = win32com.client.constants.adParamOutput
## newParm.Type = ff.Type
## newParm.Value = None
## dstParms.append(newParm)
dstStmt = 'Insert into %s (' % sqlName(srcTable)
ii = 0
for ff in dstFields:
fmt = '%s'
if ii > 0:
fmt = ',' + fmt
dstStmt = dstStmt + (fmt % ff)
ii = ii + 1
dstStmt = dstStmt + ') Values ('
ii = 0
for ff in dstFields:
if ii == 0:
dstStmt = dstStmt + '?'
else:
dstStmt = dstStmt + ',?'
ii = ii + 1
dstStmt = dstStmt + ')'
dstCmd = win32com.client.Dispatch(r'ADODB.Command')
dstCmd.ActiveConnection = dstConn
dstCmd.Prepared = 1
dstCmd.CommandType = win32com.client.constants.adCmdText
dstCmd.CommandTimeout = 20
dstCmd.CommandText = dstStmt
## for parm in dstParms:
## dstCmd.Parameters.Append(parm)
ii = 0
while srcRs.EOF == 0:
parms = []
for ff in srcRs.Fields:
print 'record',ii,'parm',ff.Name,ff.Value
parms.append(ff)
dstCmd.Execute(RecordsAffected=pythoncom.Empty,Parameters=parms,Options=win32com.client.constants.adCmdText)
ii = ii + 1
if 1:
return dstStmt,ii # debug
srcRs.MoveNext()
return dstStmt,ii
if __name__ == '__main__':
print "adoXferJet2Sql.py main here"
xfer = AdoXferJet2Sql()
srcConn,srcTables =
xfer.setupJetSrc("E:\\FoodBank\\Export20011222\\Export20011222.mdb")
dstConn = xfer.setupOdbcDest("FoodBankPG") # ODBC DSN connected to
PostgresDB database
for table in srcTables:
stmt,count = xfer.xferTable(table,srcConn,dstConn)
if 1:
break # debug
--
Craig H. Anderson
_______________________________________________
ActivePython mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/activepython