You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
5.2 KiB
141 lines
5.2 KiB
# 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))
|
|
|
|
# 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
|
|
try:
|
|
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()
|
|
except:
|
|
print("\n *** failed ***\n")
|
|
# 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
|
|
try:
|
|
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()
|
|
except:
|
|
print("\n *** failed ***\n")
|
|
|
|
# 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]])
|
|
|
|
|
|
# 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)
|
|
try:
|
|
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()
|
|
except:
|
|
print("\n *** failed ***\n")
|
|
|
|
|
|
# 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)
|
|
try:
|
|
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()
|
|
except:
|
|
print("\n *** failed ***\n")
|
|
|
|
# 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)
|
|
try:
|
|
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()
|
|
except:
|
|
print("\n *** failed ***\n")
|