<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Using_ADO_with_Python</id>
	<title>Using ADO with Python - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Using_ADO_with_Python"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Using_ADO_with_Python&amp;action=history"/>
	<updated>2026-05-18T20:44:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Using_ADO_with_Python&amp;diff=2150&amp;oldid=prev</id>
		<title>PeterHarding: New page: = Examples= ==jet.py==  &lt;pre&gt; #!/usr/bin/env Python  &quot;&quot;&quot; #Instantiate the Jet engine. &quot;&quot;&quot;  import win32com.client engine = win32com.client.Dispatch(&quot;DAO.DBEngine.35&quot;) #Determine the path t...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Using_ADO_with_Python&amp;diff=2150&amp;oldid=prev"/>
		<updated>2008-05-24T07:09:35Z</updated>

		<summary type="html">&lt;p&gt;New page: = Examples= ==jet.py==  &amp;lt;pre&amp;gt; #!/usr/bin/env Python  &amp;quot;&amp;quot;&amp;quot; #Instantiate the Jet engine. &amp;quot;&amp;quot;&amp;quot;  import win32com.client engine = win32com.client.Dispatch(&amp;quot;DAO.DBEngine.35&amp;quot;) #Determine the path t...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Examples=&lt;br /&gt;
==jet.py==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env Python&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
#Instantiate the Jet engine.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import win32com.client&lt;br /&gt;
engine = win32com.client.Dispatch(&amp;quot;DAO.DBEngine.35&amp;quot;)&lt;br /&gt;
#Determine the path to your database and use the following syntax:&lt;br /&gt;
db = engine.OpenDatabase(r&amp;quot;c:\temp\mydb.mdb&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Now you have an instance of the engine and an instance of a database object. Next we will open a recordset. Lets pretend we have a table in our database called &amp;#039;customers&amp;#039;. To open this table for editing/perusing, you might use the following syntax.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
rs = db.OpenRecordset(&amp;quot;customers&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# You can also do the following:&lt;br /&gt;
&lt;br /&gt;
rs = db.OpenRecordset(&amp;quot;select * from customers where state = &amp;#039;OH&amp;#039;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# You can run action queries using the dao execute method. Example:&lt;br /&gt;
&lt;br /&gt;
db.Execute(&amp;quot;delete * from customers where balancetype = &amp;#039;overdue&amp;#039; and name = &amp;#039;bill&amp;#039;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#be careful, there is no undo!  :)&lt;br /&gt;
&lt;br /&gt;
# The EOF property is available, so you can do things like:&lt;br /&gt;
&lt;br /&gt;
while not rs.EOF:&lt;br /&gt;
   print rs.Fields(&amp;quot;State&amp;quot;).Value&lt;br /&gt;
   rs.MoveNext()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==jet2sql.py==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
# jet2sql.py - Matthew C Keranen &amp;lt;mck@mpinet.net&amp;gt; [07/12/2000]&lt;br /&gt;
# --------------------------------------------------------------------&lt;br /&gt;
# Creates ANSI SQL DDL from a MS Jet database file, useful for reverse&lt;br /&gt;
# engineering database designs in E/R tools.&lt;br /&gt;
#&lt;br /&gt;
# Requires DAO 3.6 library.&lt;br /&gt;
# --------------------------------------------------------------------&lt;br /&gt;
# Usage: python jet2sql.py infile.MDB outfile.SQL&lt;br /&gt;
&lt;br /&gt;
import sys, string, pythoncom, win32com.client&lt;br /&gt;
&lt;br /&gt;
const = win32com.client.constants&lt;br /&gt;
daoEngine = win32com.client.Dispatch(&amp;#039;DAO.DBEngine.36&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
class jetReverse:&lt;br /&gt;
    def __init__ (self, infile):&lt;br /&gt;
&lt;br /&gt;
        self.jetfilename=infile&lt;br /&gt;
        self.dtbs = daoEngine.OpenDatabase(infile)&lt;br /&gt;
&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def terminate(self):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def writeTable(self, currTabl):&lt;br /&gt;
        self.writeLine(&amp;#039;\ncreate table &amp;#039; + chr(34) + currTabl.Name + chr(34),&amp;quot;&amp;quot;,1)&lt;br /&gt;
        self.writeLine(&amp;#039;(&amp;#039;,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write Columns&lt;br /&gt;
        cn=0&lt;br /&gt;
        for col in currTabl.Fields:&lt;br /&gt;
            cn = cn +1&lt;br /&gt;
            self.writeColumn(col.Name, col.Type, col.Size, col.Required, col.Attributes, col.DefaultValue, col.ValidationRule, currTabl.Fields.Count-cn)&lt;br /&gt;
&lt;br /&gt;
        # Validation Rule&lt;br /&gt;
        tablRule = currTabl.ValidationRule&lt;br /&gt;
        if tablRule &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
            tablRule = &amp;quot;    check(&amp;quot; + tablRule + &amp;quot;) &amp;quot;&lt;br /&gt;
            self.writeLine(&amp;quot;&amp;quot;,&amp;quot;,&amp;quot;,1) # add a comma and CR previous line&lt;br /&gt;
            self.writeLine(tablRule,&amp;quot;&amp;quot;,0)&lt;br /&gt;
&lt;br /&gt;
        # Primary Key&lt;br /&gt;
        pk=self.getPrimaryKey(currTabl)&lt;br /&gt;
        if pk &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
            self.writeLine(&amp;quot;&amp;quot;,&amp;quot;,&amp;quot;,1) # add a comma and CR previous line&lt;br /&gt;
            self.writeLine(pk,&amp;quot;&amp;quot;,0)&lt;br /&gt;
&lt;br /&gt;
        # End of table&lt;br /&gt;
        self.writeLine(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,1) # terminate previous line&lt;br /&gt;
        self.writeLine(&amp;#039;);&amp;#039;,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write table comment&lt;br /&gt;
        try: sql = currTabl.Properties(&amp;quot;Description&amp;quot;).Value&lt;br /&gt;
        except pythoncom.com_error: sql=&amp;quot;&amp;quot;&lt;br /&gt;
        if sql &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
           sql = &amp;quot;comment on table &amp;quot; + chr(34) + currTabl.Name + chr(34) + &amp;quot; is &amp;quot; + chr(34) + sql + chr(34) +&amp;quot;;&amp;quot;&lt;br /&gt;
           self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write column comments&lt;br /&gt;
        for col in currTabl.Fields:&lt;br /&gt;
            try: sql = col.Properties(&amp;quot;Description&amp;quot;).Value&lt;br /&gt;
            except pythoncom.com_error: sql=&amp;quot;&amp;quot;&lt;br /&gt;
            if sql &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
               sql = &amp;quot;comment on column &amp;quot; + chr(34) + currTabl.Name + chr(34) + &amp;quot;.&amp;quot; + chr(34) + col.Name + chr(34) + &amp;quot; is &amp;quot; + chr(34) + sql + chr(34) + &amp;quot;;&amp;quot;&lt;br /&gt;
               self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write Indexes&lt;br /&gt;
        self.writeIndexes(currTabl)&lt;br /&gt;
&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def writeColumn(self, colName, colType, length, requird, attributes, default, check, colRix):&lt;br /&gt;
        # colRix: 0 based index of column from right side. 0 indicates rightmost column&lt;br /&gt;
&lt;br /&gt;
        if colType == const.dbByte: dataType = &amp;quot;Byte&amp;quot;&lt;br /&gt;
        elif colType == const.dbInteger: dataType = &amp;quot;Integer&amp;quot;&lt;br /&gt;
        elif colType == const.dbSingle: dataType = &amp;quot;Single&amp;quot;&lt;br /&gt;
        elif colType == const.dbDouble: dataType = &amp;quot;Double&amp;quot;&lt;br /&gt;
        elif colType == const.dbDate: dataType = &amp;quot;DateTime&amp;quot;&lt;br /&gt;
        elif colType == const.dbLongBinary: dataType = &amp;quot;OLE&amp;quot;&lt;br /&gt;
        elif colType == const.dbMemo: dataType = &amp;quot;Memo&amp;quot;&lt;br /&gt;
        elif colType == const.dbCurrency: dataType = &amp;quot;Currency&amp;quot;&lt;br /&gt;
        elif colType == const.dbLong:&lt;br /&gt;
            if  (attributes &amp;amp; const.dbAutoIncrField): dataType = &amp;quot;Counter&amp;quot;&lt;br /&gt;
            else: dataType = &amp;quot;LongInteger&amp;quot;&lt;br /&gt;
        elif colType == const.dbText:&lt;br /&gt;
            if length == 0: dataType = &amp;quot;Text&amp;quot;&lt;br /&gt;
            else: dataType = &amp;quot;char(&amp;quot;+str(length)+&amp;quot;)&amp;quot;&lt;br /&gt;
        elif colType == const.dbBoolean:&lt;br /&gt;
            dataType = &amp;quot;Bit&amp;quot;&lt;br /&gt;
            if default == &amp;quot;Yes&amp;quot;: default = &amp;quot;1&amp;quot;&lt;br /&gt;
            else: default = &amp;quot;0&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            if length == 0: dataType = &amp;quot;Text&amp;quot;&lt;br /&gt;
            else: dataType = &amp;quot;Text(&amp;quot;+str(length)+&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if default &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
            defaultStr = &amp;quot;default &amp;quot; + default + &amp;quot; &amp;quot;&lt;br /&gt;
        else: defaultStr = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if check &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
            checkStr = &amp;quot;check(&amp;quot; + check + &amp;quot;) &amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            checkStr = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if requird or (attributes &amp;amp; const.dbAutoIncrField):&lt;br /&gt;
            mandatory = &amp;quot;not null &amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            mandatory = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        sql = &amp;quot;    &amp;quot; + chr(34) + colName + chr(34) + &amp;quot; &amp;quot; + dataType + &amp;quot; &amp;quot; + defaultStr + checkStr + mandatory&lt;br /&gt;
        if colRix &amp;gt; 0:&lt;br /&gt;
            self.writeLine(sql,&amp;quot;,&amp;quot;,1)&lt;br /&gt;
        else:&lt;br /&gt;
            self.writeLine(sql,&amp;quot;&amp;quot;,0)&lt;br /&gt;
&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def getPrimaryKey(self, currTabl):&lt;br /&gt;
&lt;br /&gt;
        # Get primary key fields&lt;br /&gt;
        sql = &amp;quot;&amp;quot;&lt;br /&gt;
        for idx in currTabl.Indexes:&lt;br /&gt;
           if idx.Primary:&lt;br /&gt;
              idxName = idx.Name&lt;br /&gt;
              sql = &amp;quot;    primary key &amp;quot;&lt;br /&gt;
              cn=0&lt;br /&gt;
              for col in idx.Fields:&lt;br /&gt;
                  cn=cn+1&lt;br /&gt;
                  sql = sql + chr(34) + col.Name + chr(34)&lt;br /&gt;
                  if idx.Fields.Count &amp;gt; cn : sql = sql + &amp;quot;,&amp;quot;&lt;br /&gt;
        return sql&lt;br /&gt;
&lt;br /&gt;
    def writeIndexes(self, currTabl):&lt;br /&gt;
&lt;br /&gt;
        # Write index definition&lt;br /&gt;
        nIdx = -1&lt;br /&gt;
        for idx in currTabl.Indexes:&lt;br /&gt;
            nIdx = nIdx + 1&lt;br /&gt;
            idxName = idx.Name&lt;br /&gt;
            tablName = currTabl.Name&lt;br /&gt;
            if idx.Primary:&lt;br /&gt;
                idxName = tablName + &amp;quot;_PK&amp;quot;&lt;br /&gt;
            elif idxName[:9] == &amp;quot;REFERENCE&amp;quot;:&lt;br /&gt;
               idxName = tablName + &amp;quot;_FK&amp;quot; + idxName[10:]&lt;br /&gt;
            else:&lt;br /&gt;
                idxName = tablName + &amp;quot;_IX&amp;quot; + str(nIdx)&lt;br /&gt;
&lt;br /&gt;
            sql = &amp;quot;create &amp;quot;&lt;br /&gt;
            if idx.Unique: sql = sql + &amp;quot;unique &amp;quot;&lt;br /&gt;
            if idx.Clustered: sql = sql + &amp;quot;clustered &amp;quot;&lt;br /&gt;
            sql = sql + &amp;quot;index &amp;quot; + chr(34) + idxName + chr(34)&lt;br /&gt;
            sql = sql + &amp;quot; on &amp;quot; + chr(34) + tablName + chr(34) + &amp;quot; (&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            # Write Index Columns&lt;br /&gt;
            cn=0&lt;br /&gt;
            for col in idx.Fields:&lt;br /&gt;
                cn = cn + 1&lt;br /&gt;
                sql = sql + chr(34) + col.Name + chr(34)&lt;br /&gt;
                if col.Attributes &amp;amp; const.dbDescending:&lt;br /&gt;
                    sql = sql + &amp;quot; desc&amp;quot;&lt;br /&gt;
                else:&lt;br /&gt;
                    sql = sql + &amp;quot; asc&amp;quot;&lt;br /&gt;
                if idx.Fields.Count &amp;gt; cn: sql = sql + &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            sql=sql + &amp;quot; );&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def writeForeignKey(self, currRefr):&lt;br /&gt;
&lt;br /&gt;
        # Export foreign key&lt;br /&gt;
        sql = &amp;quot;\nalter table &amp;quot; + chr(34) + currRefr.ForeignTable + chr(34)&lt;br /&gt;
        self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        sql = &amp;quot;    add foreign key (&amp;quot;&lt;br /&gt;
        cn = 0&lt;br /&gt;
        for col in currRefr.Fields:&lt;br /&gt;
            cn = cn + 1&lt;br /&gt;
            sql = sql + chr(34) + col.ForeignName + chr(34)&lt;br /&gt;
            if currRefr.Fields.Count &amp;gt; cn: sql = sql + &amp;quot;,&amp;quot;&lt;br /&gt;
            &lt;br /&gt;
        sql = sql + &amp;quot;)&amp;quot;&lt;br /&gt;
        self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        sql = &amp;quot;    references &amp;quot; + chr(34) + currRefr.Table + chr(34) + &amp;quot; (&amp;quot;&lt;br /&gt;
        cn = 0&lt;br /&gt;
        for col in currRefr.Fields:&lt;br /&gt;
            cn = cn + 1&lt;br /&gt;
            sql = sql + chr(34) + col.Name + chr(34)&lt;br /&gt;
            if currRefr.Fields.Count &amp;gt; cn: sql = sql + &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        sql = sql + &amp;quot;)&amp;quot;&lt;br /&gt;
        if (currRefr.Attributes &amp;amp; const.dbRelationUpdateCascade) &amp;lt;&amp;gt; 0:&lt;br /&gt;
           sql = sql + &amp;quot; on update cascade&amp;quot;&lt;br /&gt;
        if (currRefr.Attributes &amp;amp; const.dbRelationDeleteCascade) &amp;lt;&amp;gt; 0:&lt;br /&gt;
           sql = sql + &amp;quot; on delete cascade&amp;quot;&lt;br /&gt;
        sql=sql+&amp;quot;;&amp;quot;&lt;br /&gt;
        self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def writeQuery(self, currQry):&lt;br /&gt;
&lt;br /&gt;
        sql = &amp;quot;\ncreate view &amp;quot; + chr(34) + currQry.Name + chr(34) + &amp;quot; as&amp;quot;&lt;br /&gt;
        self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write Query text&lt;br /&gt;
        sql=string.replace(currQry.SQL,chr(13),&amp;quot;&amp;quot;) # Get rid of extra linefeeds&lt;br /&gt;
        self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
&lt;br /&gt;
        # Write Query comment&lt;br /&gt;
        try: sql = currQry.Properties(&amp;quot;Description&amp;quot;).Value&lt;br /&gt;
        except pythoncom.com_error: sql=&amp;quot;&amp;quot;&lt;br /&gt;
        if sql &amp;lt;&amp;gt; &amp;quot;&amp;quot;:&lt;br /&gt;
            sql =  &amp;quot;comment on table &amp;quot; + chr(34) + currQry.Name + chr(34) + &amp;quot; is &amp;quot; + chr(34) + sql + chr(34)&lt;br /&gt;
            self.writeLine(sql,&amp;quot;&amp;quot;,1)&lt;br /&gt;
            &lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    def writeLine(self,strLine, delimit, newline):&lt;br /&gt;
        # Used for controlling where lines terminate with a comma or other continuation mark&lt;br /&gt;
        sqlfile.write(strLine)&lt;br /&gt;
        if delimit: sqlfile.write(delimit)&lt;br /&gt;
        if newline: sqlfile.write(&amp;#039;\n&amp;#039;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    if len(sys.argv)&amp;lt;2:&lt;br /&gt;
        print &amp;quot;Usage: jet2sql.py infile.mdb outfile.sql&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        jetEng = jetReverse(sys.argv[1])&lt;br /&gt;
        outfile = sys.argv[2]&lt;br /&gt;
&lt;br /&gt;
        sqlfile = open(outfile,&amp;#039;w&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;\nReverse engineering %s to %s&amp;quot; % (jetEng.jetfilename, outfile)&lt;br /&gt;
&lt;br /&gt;
        # Tables&lt;br /&gt;
        sys.stdout.write(&amp;quot;\n   Tables&amp;quot;)&lt;br /&gt;
        for tabl in jetEng.dtbs.TableDefs:&lt;br /&gt;
            sys.stdout.write(&amp;quot;.&amp;quot;)&lt;br /&gt;
            if tabl.Name[:4] &amp;lt;&amp;gt; &amp;quot;MSys&amp;quot; and tabl.Name[:4] &amp;lt;&amp;gt; &amp;quot;~TMP&amp;quot;:&lt;br /&gt;
                jetEng.writeTable(tabl)&lt;br /&gt;
&lt;br /&gt;
        # Relations / FKs&lt;br /&gt;
        sys.stdout.write(&amp;quot;\n   Relations&amp;quot;)&lt;br /&gt;
        for fk in jetEng.dtbs.Relations:&lt;br /&gt;
            sys.stdout.write(&amp;quot;.&amp;quot;)&lt;br /&gt;
            jetEng.writeForeignKey(fk)&lt;br /&gt;
&lt;br /&gt;
        # Queries&lt;br /&gt;
        sys.stdout.write(&amp;quot;\n   Queries&amp;quot;)&lt;br /&gt;
        for qry in jetEng.dtbs.QueryDefs:&lt;br /&gt;
            sys.stdout.write(&amp;quot;.&amp;quot;)&lt;br /&gt;
            jetEng.writeQuery(qry)&lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;\n   Done\n&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # Done&lt;br /&gt;
        sqlfile.close()&lt;br /&gt;
        jetEng.terminate()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==msjet.py==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		# attempt to attach to the database - if that fails, create a new one&lt;br /&gt;
		# use the file name as the base name for the database&lt;br /&gt;
		self.dbName = os.path.splitext(fileName)[0]&lt;br /&gt;
		dsn = &amp;#039;Provider=Microsoft.Jet.OLEDB.4.0;&amp;#039; + \&lt;br /&gt;
				&amp;#039;Jet OLEDB:Engine Type=5;&amp;#039; + \&lt;br /&gt;
				&amp;#039;Data Source=&amp;#039; + &amp;#039;test.mdb&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		# try to create the database&lt;br /&gt;
		catalog = win32com.client.Dispatch(&amp;#039;ADOX.Catalog&amp;#039;) &lt;br /&gt;
		try:&lt;br /&gt;
			catalog.Create(dsn)&lt;br /&gt;
			catalog.ActiveConnection = dsn&lt;br /&gt;
		except:&lt;br /&gt;
			raise &amp;quot;Can&amp;#039;t connect to database table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		# create a table with the appropriate field names&lt;br /&gt;
		table = win32com.client.Dispatch(&amp;#039;ADOX.Table&amp;#039;) &lt;br /&gt;
		self.rs = win32com.client.Dispatch(&amp;#039;ADODB.Recordset&amp;#039;)&lt;br /&gt;
		table.Name = &amp;quot;TabName&amp;quot;&lt;br /&gt;
&lt;br /&gt;
		Column = win32com.client.Dispatch(&amp;quot;ADOX.Column&amp;quot;)&lt;br /&gt;
		Column.Name = &amp;quot;AutoNumber&amp;quot;&lt;br /&gt;
		Column.Type = 3 # adInteger&lt;br /&gt;
		Column.ParentCatalog = catalog&lt;br /&gt;
		Column.Properties(&amp;#039;Autoincrement&amp;#039;).Value = win32com.client.pywintypes.TRUE&lt;br /&gt;
		table.Columns.Append(Column)&lt;br /&gt;
&lt;br /&gt;
		Key = win32com.client.Dispatch(&amp;quot;ADOX.Key&amp;quot;)&lt;br /&gt;
		Key.Name = &amp;quot;PrimaryKey&amp;quot;&lt;br /&gt;
		Key.Type = 1 #win32.com.client.constants.adKeyPrimary&lt;br /&gt;
		Key.RelatedTable = &amp;quot;TabName&amp;quot;&lt;br /&gt;
		Key.Columns.append(&amp;quot;AutoNumber&amp;quot;)&lt;br /&gt;
		table.Keys.Append(Key)&lt;br /&gt;
&lt;br /&gt;
		# add other fields using table.Columns.Append()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		catalog.Tables.Append(table)&lt;br /&gt;
		del table&lt;br /&gt;
		del catalog&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==odbc.py==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import dbi, odbc     # ODBC modules&lt;br /&gt;
import time          # standard time module&lt;br /&gt;
&lt;br /&gt;
dbc = odbc.odbc(     # open a database connection&lt;br /&gt;
    &amp;#039;sample/monty/spam&amp;#039;  # &amp;#039;datasource/user/password&amp;#039;&lt;br /&gt;
    )&lt;br /&gt;
crsr = dbc.cursor()  # create a cursor&lt;br /&gt;
crsr.execute(        # execute some SQL&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    SELECT country_id, name, insert_change_date&lt;br /&gt;
    FROM country&lt;br /&gt;
    ORDER BY name&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
print &amp;#039;Column descriptions:&amp;#039;  # show column descriptions&lt;br /&gt;
for col in crsr.description:&lt;br /&gt;
    print &amp;#039; &amp;#039;, col&lt;br /&gt;
result = crsr.fetchall()      # fetch the results all at once&lt;br /&gt;
print &amp;#039;\nFirst result row:\n &amp;#039;, result[0]  # show first result row&lt;br /&gt;
print &amp;#039;\nDate conversions:&amp;#039;   # play with dbiDate object&lt;br /&gt;
date = result[0][-1]&lt;br /&gt;
fmt = &amp;#039;  %-25s%-20s&amp;#039;&lt;br /&gt;
print fmt % (&amp;#039;standard string:&amp;#039;, str(date))&lt;br /&gt;
print fmt % (&amp;#039;seconds since epoch:&amp;#039;, float(date))&lt;br /&gt;
timeTuple = time.localtime(date)&lt;br /&gt;
print fmt % (&amp;#039;time tuple:&amp;#039;, timeTuple)&lt;br /&gt;
print fmt % (&amp;#039;user defined:&amp;#039;, time.strftime(&amp;#039;%d %B %Y&amp;#039;, timeTuple))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:ADO]]&lt;br /&gt;
[[Category:ODBC]]&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>