conecting with a MsAcces DB by dao
luis
solisgb at gmail.com
Mon Jul 3 03:28:42 EDT 2006
Iain King ha escrito:
> luis wrote:
> > Iain King ha escrito:
> >
> > > luis wrote:
> > > > Iain King ha escrito:
> > > >
> > > > > luis wrote:
> > > > > > while not rs.EOF:
> > > > > > id=rs.Fields(colName.Value) #colName, valid column name
> > > > > > ...
> > > > > > rs.MoveNext()
> > > > > > rs.Close()
> > > > > > conn.Close()
> > > > >
> > > > > I don't know if it's the problem your asking about, but your
> > > > > rs.MoveNext() should be inside the while loop, no?
> > > > Yes, is inside
> > > > >
> > >
> > > You mean, it is inside the while loop in your code, but you made a
> > > mistake copying it into your post? In the code you posted it is not
> > > inside the while loop - it would have to be indented one more level for
> > > that.
> > >
> > > Iain
> >
> > this is te correct identation
> >
> > def append_from_Access(self):
> > try:
> > import ...
> > conn = win32com.client.Dispatch(r'ADODB.Connection')
> > DSN = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA
> > SOURCE=C:/Afile.mdb;"
> > conn.Open(DSN)
> > except Exception, inst:
> > ...
> > try:
> > sql_statement='SELECT * FROM Mytable'
> > rs = win32com.client.Dispatch(r'ADODB.Recordset')
> > rs.Open(sql_statement, conn, 1, 3)
> > while not rs.EOF:
> > id=rs.Fields(colName.Value) #colName, valid column name
> > ...
> > rs.MoveNext()
> > rs.Close()
> > conn.Close()
> >
> > except Exception, inst:
> > ...
> >
> > I think my problem must be with ado and dao.
> > Now I have run makepy utility and select Microsoft ActiveX Data Objects
> > 2.5 Library, perhaps I must also select Microsoft DAO3.5 Object Library
> > and write
> > win32com.client.Dispatch("DAO.DBEngine.35") for Access 97 or
> > win32com.client.Dispatch(r'ADODB.Connection') for Acess 2000
> > Do you know is it possible ?
> > luis
>
> Well, without being able to test on your system I don't think I can
> give you any real advice. This is the module I use to interface with
> Access:
>
> Access.py
> ---------------
> import win32com.client
> from win32com.client import constants
>
> def isWriteable(field):
> """Is given Field writeable?"""
> return field.Attributes & 4
>
>
> class Access(object):
> def __init__(self, filename, password=""):
> self._filename = filename
> self._connection = win32com.client.Dispatch(r'ADODB.Connection')
> if password:
> self._DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=%s;Jet
> OLEDB:Database Password=%s;' % (filename, password)
> else:
> self._DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=%s;' %
> (filename)
>
> def Query(self, query):
> self._connection.Open(self._DSN)
> rs = win32com.client.Dispatch(r'ADODB.Recordset')
> rs.Open(query, self._connection, 1, 3)
> fields = []
> for x in xrange(rs.Fields.Count):
> fields.append(rs.Fields(x).Name)
> if rs.EOF:
> data = []
> else:
> data = rs.GetRows()
> rs.Close()
> self._connection.Close()
> return fields, data
>
>
> def Add(self, table, records):
> """Adds records to table."""
> self._connection.Open(self._DSN)
> rs = win32com.client.Dispatch(r'ADODB.Recordset')
> rs.Open(table, self._connection, 1, 3)
> unwriteables = []
> for record in records:
> rs.AddNew()
> unwriteable = []
> for i in xrange(len(record)):
> if isWriteable(rs.Fields(i)):
> rs.Fields(i).Value = record[i]
> else:
> unwriteable.append(rs.Fields(i).Value)
> unwriteables.append(unwriteable)
> rs.Update()
> rs.Close()
> self._connection.Close()
> return unwriteables
>
>
> def Update(self, query, function):
> """Updates all records found in query with function(record)"""
> self._connection.Open(self._DSN)
> rs = win32com.client.Dispatch(r'ADODB.Recordset')
> rs.Open(query, self._connection, 1, 3)
> columns = rs.Fields.Count
> while not rs.EOF:
> record = []
> for i in xrange(columns):
> record.append(rs.Fields(i).Value)
> newRecord = function(record[:])
> for i in xrange(columns):
> if isWriteable(rs.Fields(i)):
> rs.Fields(i).Value = newRecord[i]
> rs.MoveNext()
> rs.Close()
> self._connection.Close()
>
>
> def Delete(self, query):
> """Deletes all records found in query"""
> self._connection.Open(self._DSN)
> rs = win32com.client.Dispatch(r'ADODB.Recordset')
> rs.Open(query, self._connection, 1, 3)
> while not rs.EOF:
> rs.Delete()
> rs.MoveNext()
> rs.Close()
> self._connection.Close()
>
>
> We only have Access 2000+, so I don't know if it'll work with prior
> versions.
>
> Iain
Thanks, for your code
My problem was opening a query (not a table) on mdb file
1) If the query includes a where clause type
field1="edf" and field2=3
, for example, no problem, Access can retrieve a not empty recordset
and my python code too.
2) But if the Access's query includes a LIKE clause, for example
field1="e*"
, Access can retrieves a not empty recordset but my python code
retrieves a empty recordset.
If I write the WHERE clause inside my python code, the recorset returns
an non empty recordset. Perhaps the problem was the different use of *
and % in Access and SQL, I don't know.
Luis
More information about the Python-list
mailing list