Testing System Data access

Depending of Drivers some test will works, and other may not

Drivers may be at: https://www.microsoft.com/fr-fr/download/details.aspx?id=13255


In [ ]:
# pyodbc 
import pyodbc

# look for pyodbc providers
sources = pyodbc.dataSources()
dsns = list(sources.keys())
sl = ['    %s [%s]' % (dsn, sources[dsn]) for dsn in dsns]
print("pyodbc Providers: (beware 32/64 bit driver and python version must match)\n", '\n'.join(sl))

In [ ]:
# odbc to EXCEL .xls via pyodbc (beware 32/64 bit driver and pytho version must match)
import pyodbc, os
filename = os.path.join(os.getcwd(), 'test.xls')
todo = "select * from [Sheet1$]"
print("\nusing pyodbc to read an Excel .xls file:\n\t", filename)
if os.path.exists(filename):
    CNXNSTRING = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;READONLY=FALSE' % filename
    cnxn = pyodbc.connect(CNXNSTRING, autocommit=True)
    cursor = cnxn.cursor()
    rows = cursor.execute(todo).fetchall()
    print([column[0] for column in cursor.description])
    print(rows)
    cursor.close()
    cnxn.close()

In [ ]:
# odbc to ACCESS .mdb via pyodbc (beware 32/64 bit driver and python version must match)
import pyodbc, os
filename = os.path.join(os.getcwd(), 'test.mdb')
print("\nusing pyodbc to read an ACCESS .mdb file:\n\t", filename)
if os.path.exists(filename):
    CNXNSTRING = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;READONLY=FALSE' % filename
    cnxn = pyodbc.connect(CNXNSTRING, autocommit=False)
    cursor = cnxn.cursor()
    rows = cursor.execute("select *  from users").fetchall()
    print([column[0] for column in cursor.description])
    print(rows)
    cursor.close()
    cnxn.close()

In [ ]:
# pythonnet
import clr
clr.AddReference("System.Data")
import System.Data.OleDb as ADONET
import System.Data.Odbc as ODBCNET
import System.Data.Common as DATACOM

table = DATACOM.DbProviderFactories.GetFactoryClasses()
print("\n .NET Providers: (beware 32/64 bit driver and pytho version must match)")
for  row in table.Rows:
    print("   %s" % row[table.Columns[0]])
    print("      ",[row[column] for column in table.Columns if column != table.Columns[0]])

In [ ]:
# odbc to EXCEL .xls via pythonnet
import clr, os
clr.AddReference("System.Data")
import System.Data.OleDb as ADONET
import System.Data.Odbc as ODBCNET
import System.Data.Common as DATACOM

filename = os.path.join(os.getcwd(), 'test.xls')
todo = "select * from [Sheet1$]"
print("\nusing pythonnet to read an excel .xls file:\n\t", filename , "\n\t", todo)
if os.path.exists(filename):
    CNXNSTRING = 'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=%s;READONLY=FALSE' % filename
    cnxn = ODBCNET.OdbcConnection(CNXNSTRING)
    cnxn.Open()
    command = cnxn.CreateCommand()
    command.CommandText = "select * from [Sheet1$]"
    rows = command.ExecuteReader()
    print ([rows.GetName(i) for i in range(rows.FieldCount)])
    for  row in rows:
        print([row[i] for i in range(rows.FieldCount)])
    command.Dispose()
    cnxn.Close()

In [ ]:
# odbc to ACCESS .mdb via pythonnet
import clr, os
clr.AddReference("System.Data")
import System.Data.OleDb as ADONET
import System.Data.Odbc as ODBCNET
import System.Data.Common as DATACOM

filename = os.path.join(os.getcwd(), 'test.mdb')
todo = "select * from users"
print("\nusing odbc via pythonnet to read an ACCESS .mdb file:\n\t", filename , "\n\t", todo)

if os.path.exists(filename):
    CNXNSTRING = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;READONLY=FALSE' % filename
    cnxn = ODBCNET.OdbcConnection(CNXNSTRING)
    cnxn.Open()
    command = cnxn.CreateCommand()
    command.CommandText = "select * from users"
    rows = command.ExecuteReader()
    print ([rows.GetName(i) for i in range(rows.FieldCount)])
    for  row in rows:
        print([row[i] for i in range(rows.FieldCount)])
    command.Dispose()
    cnxn.Close()

In [ ]:
# DAO via pythonnet: works ONLY if you have the 32 (or 64 bit) driver.
import clr, os
clr.AddReference("System.Data")
import System.Data.OleDb as ADONET
import System.Data.Odbc as ODBCNET
import System.Data.Common as DATACOM

filename = os.path.join(os.getcwd(), 'test.accdb')
todo = "select * from users"
print("\nusing DAO via pythonnet to read an ACCESS .mdb file:\n\t", filename , "\n\t", todo)
if os.path.exists(filename):
    # needs a driver in 32 or 64 bit like your running python
    # https://www.microsoft.com/download/details.aspx?id=13255
    CNXNSTRING = 'Provider=Microsoft.ACE.OLEDB.12.0; Data Source=%s;READONLY=FALSE' % filename
    cnxn = ADONET.OleDbConnection(CNXNSTRING)
    cnxn.Open()
    command = cnxn.CreateCommand()
    command.CommandText = todo
    # command.CommandText = 'select id, name from people where group_id = @group_id'
    # command.Parameters.Add(SqlParameter('group_id', 23))
    rows = command.ExecuteReader()
    print ([rows.GetName(i) for i in range(rows.FieldCount)])
    for  row in rows:
        print([row[i] for i in range(rows.FieldCount)])
    command.Dispose()
    cnxn.Close()

In [ ]: