Concept Error

chris lyon chris.lyon at spritenote.co.uk
Sun Jul 7 01:30:43 EDT 2002


I've been at it all night and I don't understand why this does work:-
(Its derived from www.e-coli.net/pyado.html , ok it's a straight copy )


import win32com.client

class RecordSet:
    def __init__(self, DBConnection):
        """Initialize a Record Set Object"""
        self.rs = win32com.client.Dispatch(r'ADODB.Recordset')
        self.conn = DBConnection

    def listfields(self):
        for x in range (self.rs.Fields.Count):
            print 'Name:-',self.rs.Fields.Item(x).Name
            print 'DefinedSize:-',self.rs.Fields.Item(x).DefinedSize
            print 'Type:-',self.rs.Fields.Item(x).Type
            print 'Value:-',self.rs.Fields.Item(x).Value

conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:/octavia/c4i.mdb;'
conn.Open(DSN)

 fred = RecordSet(a)
 fred.rs.CursorLocation = 3
 fred.rs.Open('[Categories]',a.conn,1,3)
 fred.listfields()



But this fails to run.

import win32com.client

class RecordSet:
    def __init__(self, DBConnection):
        """Initialize a Record Set Object"""
        self.rs = win32com.client.Dispatch(r'ADODB.Recordset')
        self.conn = DBConnection

    def listfields(self):
        for x in range (self.rs.Fields.Count):
            print 'Name:-',self.rs.Fields.Item(x).Name
            print 'DefinedSize:-',self.rs.Fields.Item(x).DefinedSize
            print 'Type:-',self.rs.Fields.Item(x).Type
            print 'Value:-',self.rs.Fields.Item(x).Value

    def getalltable(self , tablename, conn):
        self.rs.CursorLocation = 3      #adUseClient
        self.rs.Open('[Categories]', conn , 1 ,3)   #adOpenKeySet
adLockOptimistic

conn = win32com.client.Dispatch(r'ADODB.Connection')
DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=c:/octavia/c4i.mdb;'
conn.Open(DSN)

fred = RecordSet(a)
fred.rs.CursorLocation = 3
fred.getalltable('Categories', a)
fred.listfields()


It Fails with:-

  File
"C:\Python21\win32com\gen_py\00000205-0000-0010-8000-00AA006D2EA4x0x2x5.py",
line 2008, in Open
    return self._oleobj_.InvokeTypes(0x3fe, LCID, 1, (24, 0), ((12, 17),
(12, 17), (3, 49), (3, 49), (3, 49)),Source, ActiveConnection, CursorType,
LockType, Options)
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a
buffer object.

Why can't I just treat rs as a property of the class RecordSet ?
Obviously I can get functionality I require but I do not understand why I
can't treat the RecordSet this way.

I've examined as much of the underlying code as I can but I'm quickly lost,
and I notice that win32com.client.Dispatch is a function not a class so I
can't sub-class it so that way seems closed.

It feels that I am missunderstanding some aspect of the class mechanism so I
would dearly like to know what I'm doing wrong.

( And I will NOT write this app in VBScript :-)

Chris Lyon









More information about the Python-list mailing list