因为工作中用到ADO访问工业数据库,在这做一个记录。ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。
Python是没有自带访问windows系统API的库的,需要下载。库的名称叫pywin32,可以从这个地址选择合适的版本直接下载。
下载安装好后,可以在PythonWin中运行Makepy工具(启动IDE,选择Tools-->COM Makepy utility工具,然后选择相应的应用程序库),这是为了创建并缓存应用程序需要的对象。可以不这么做,但这可以提高运行效率。
ADO的五个基本对象类型
Connection Object连接对象
连接对象经常用于管理一个数据源连接,你可以通过指定数据库驱动名、数据库服务器地址、用户名、密码及其它的参数告诉它如何去连接一个数据库。所有其它的ADO对象都是建立在连接对象的基础之上的。而连接对象则有一个不需要其它ADO对象的方法。我们将详细讨论这个方法,但不会频繁的去使用它,这些我将在以后进行解释。
RecordSet Object记录集对象
记录集对象是一个数据库查询或存储过程运行结果的集合。记录集对象可以同时访问一个包含多个字段集合的单独行,这个字段集合用于表述这一行中的多个对应列。记录集对象提供了一些方法让我们可以自由的访问纪录集中的上一行、下一行、第一行、最后一行。有时在处理象SQL Server之类数据库时,它的存储过程可以同时返回多个具有不同列和列类型集合的记录集时,记录集对象也可以在每个一个结果集合中进行跳转。记录集也可以运行自己的查询/存储过程(?在与一个连接对象进行关联之后?)并获得返回的结果。但是我们不会重点去讨论这个,而通常是通过将命令对象(连接对象)的运行结果赋给一个记录集对象,并运用记录集去处理结果中的每一行。
Field Object字段对象
字段对象用于描述每个记录行中的每一列。因为每一个SQL查询都可能返回多个不同列,因此一个记录集对象中也包含多个字段对象。第个字段对象都包含字段值、字段类型(整数型、字符型、浮点型、货币型等等)、字段最大长度、精度等等。在本指南中我们经常将处理记录集对象中的字段。
Command Object命令对象
命名对象是的依附于连接对象一个很代表性的对象,通过一个连接去运行查询、存储过程或存取表格。如果有结果返回,那就将是一个包含结果的记录集对象。我们在这个指南中的很多范例,都采用了这种方式。一个主要的特征是命令对象有为查询或存储过程提供不同参数的能力。在后面的章节中我们将看到这是一个很好用的功能,要比通过连接或记录集对象来执行查询要好的多。
Parameter Object参数对象
参数对象是命令对象的一个重要伙伴,经常用于象命令对象提供参数。命令对象可以有不同的参数对象。尽管新手们很少使用它,但我们要明白使用参数对象将给我们提供不少的方便和益处。在后面的章节中我们将逐步讨论使用参数对象的原因和优点。
以下是一段SQL Server数据库增删改查实例,数据库名MyDB,表abc,两个字段id和name。
#-*- coding: utf-8 -*-
import win32com.client
DSN = r"Provider=SQLOLEDB;UID=sa;PWD=123;Database=MyDB;Server=localhost"
#insert
Insert = win32com.client.Dispatch(r"ADODB.Command")
Insert.ActiveConnection = DSN
Insert.CommandText = r"INSERT INTO dbo.abc (id,name) VALUES ('22','abc') "
Insert.CommandType = 1
Insert.CommandTimeout = 0
Insert.Prepared = True
Insert.Execute()
#delete
Delete = win32com.client.Dispatch(r"ADODB.Command")
Delete.ActiveConnection = DSN
Delete.CommandText = r"DELETE FROM dbo.abc WHERE id = '11'"
Delete.CommandType = 1
Delete.CommandTimeout = 0
Delete.Prepared = True
Delete.Execute()
#update
Update = win32com.client.Dispatch(r"ADODB.Command")
Update.ActiveConnection = DSN
Update.CommandText = r"UPDATE dbo.abc SET name='aaa' WHERE id='22' "
Update.CommandType = 1
Update.CommandTimeout = 0
Update.Prepared = True
Update.Execute()
#select
Rs = win32com.client.Dispatch(r"ADODB.Recordset")
Rs.ActiveConnection = DSN
Rs.Source = r"SELECT id, name FROM dbo.abc"
Rs.CursorType = 0
Rs.CursorLocation = 2
Rs.LockType = 1
Rs.Open()
numRows = 0
while not Rs.EOF:
print r'id:',Rs.Fields.Item("id").Value.encode('gbk')
if Rs.Fields.Item("name").Value != None:
print r' name:',Rs.Fields.Item("name").Value.encode('gbk')
numRows+=1
Rs.MoveNext()
print 'Total Rows:',numRows
关于各个对象的更多具体属性和参数可以看这个博客ADO and Python