免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8396 | 回复: 12
打印 上一主题 下一主题

原创翻译:Python下的ADO编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-12 21:51 |只看该作者 |倒序浏览
个的练手之作,原文请参看http://www.mayukhbose.com/python/ado/what-is-ado.php


Python ADO 编程指南

第0章:介绍
Python 是一个面向对象的编程语言,它在近年来非常流行。ADO(ActiveX Data Objects)是微软推出的在Windows平台上大行其道的数据库访问方式。然而,在网络上却很少有同时讲述python和ado的文档。这篇指南的目的就是为了改变这一现状,同时提供一些用python进行COM编程的方法。
这篇指南的表述方式是先提出一些ADO的概念,然后用一些python代码来说明,因此读者要有一些SQL和Python的基本知识。
警告:作者不会对本文出现的错误或疏忽,或是本文的信息而导致出现的任何后果负责任。

PS:译者是一个python和ADO的初学者,再加对英语也是一瓶不满,所以有了问题也不要找我哦
再PS:这篇文章的翻译不完全是逐字逐句的翻译,那就象是用Google机器翻译一样了,有大部分是意译,即用自己的话再说一篇,由于水平有限,难免会有一些贻笑大方的地方,更会有一些错误,所以请一定要指出,我会用心改进。-_-|

论坛徽章:
0
2 [报告]
发表于 2008-09-12 21:52 |只看该作者
第一章:什么是ADO
大家所熟知的ADO(ActiveX Data Objects)是微软在1996年四季度提出的一项技术,用于提供一个统一的从各类数据库中存取各类数据的方法。这意味着你可以用相同的方式去使用Access,Microsoft SQL Server,Sybase,Oracle等数据库。其实在此之前微软已经提供了ODBC(Object Database Connectivity)标准,并被广泛的使用。但是它太老了,各种问题也不断出现。因此,微软的ADO技术诞生了。
一些象Perl和Delphi之类的编程语言已经通过DBI和BDE接口提供了自己对数据库存取技术。但ADO技术提供了一种语言无关的数据库存取技术,只要你的语言支持COM接口。这样你可以通过Python,Delphi,Borland C++ Builder,VB,ASP,Visual C++和其它的.NET等语言来使用ADO技术。最初的ADO仅是设计来使用处理关联性数据库,但是随着V2.5的推出,ADO也可以用来处理文件夹、电子邮件、文本文件等。而V2.7的目标更是可以处理XML和SQL Server 2000等数据引擎。这篇指南将仅仅讨论使用ADO处理数据库方面的问题。
ADO的一个缺点就是只能在微软操作系统中使用,如Windows 98,2000,ME,XP等。而更早的ODBC技术则逐渐被UNIX平台所采纳。因此我们有理由相信ADO技术也有向跨平台发展的可能。但至少现在使用ADO技术也就意味着客户端程序只能在Windows程序中使用。不管怎么说,数据库服务器则是可以运行在包括*NIX的任何操作平台上,只要在客户端的Windows系统中安装了相应的驱动。

论坛徽章:
0
3 [报告]
发表于 2008-09-12 21:55 |只看该作者
第二章:基本的ADO对象
虽然有各种不同的ADO对象,但是本指南中我们仅讨论5个主要的方面。在这一章节中,我们将快速对了解五个主要对象,并且在以后的章节中陆续统一讲解。更多的信息可以访问Microsoft MSDN website
Connection Object连接对象
连接对象经常用于管理一个数据源连接,你可以通过指定数据库驱动名、数据库服务器地址、用户名、密码及其它的参数告诉它如何去连接一个数据库。所有其它的ADO对象都是建立在连接对象的基础之上的。而连接对象则有一个不需要其它ADO对象的方法。我们将详细讨论这个方法,但不会频繁的去使用它,这些我将在以后进行解释。
RecordSet Object记录集对象
记录集对象是一个数据库查询或存储过程运行结果的集合。记录集对象可以同时访问一个包含多个字段集合的单独行,这个字段集合用于表述这一行中的多个对应列。记录集对象提供了一些方法让我们可以自由的访问纪录集中的上一行、下一行、第一行、最后一行。有时在处理象SQL Server之类数据库时,它的存储过程可以同时返回多个具有不同列和列类型集合的记录集时,记录集对象也可以在每个一个结果集合中进行跳转。记录集也可以运行自己的查询/存储过程(?在与一个连接对象进行关联之后?)并获得返回的结果。但是我们不会重点去讨论这个,而通常是通过将命令对象(连接对象)的运行结果赋给一个记录集对象,并运用记录集去处理结果中的每一行。
Field Object字段对象
字段对象用于描述每个记录行中的每一列。因为每一个SQL查询都可能返回多个不同列,因此一个记录集对象中也包含多个字段对象。第个字段对象都包含字段值、字段类型(整数型、字符型、浮点型、货币型等等)、字段最大长度、精度等等。在本指南中我们经常将处理记录集对象中的字段。
Command Object命令对象
命名对象是的依附于连接对象一个很代表性的对象,通过一个连接去运行查询、存储过程或存取表格。如果有结果返回,那就将是一个包含结果的记录集对象。我们在这个指南中的很多范例,都采用了这种方式。一个主要的特征是命令对象有为查询或存储过程提供不同参数的能力。在后面的章节中我们将看到这是一个很好用的功能,要比通过连接或记录集对象来执行查询要好的多。
Parameter Object参数对象
参数对象是命令对象的一个重要伙伴,经常用于象命令对象提供参数。命令对象可以有不同的参数对象。尽管新手们很少使用它,但我们要明白使用参数对象将给我们提供不少的方便和益处。在后面的章节中我们将逐步讨论使用参数对象的原因和优点

论坛徽章:
0
4 [报告]
发表于 2008-09-12 21:58 |只看该作者
第三章:什么是参数,我们如何去使用它?
参数是一种模型,在DBI、BDE、ODBC等接口中广泛采用。ADO也提供了参数使用,而新手们去不知道甚至不考虑使用参数。所以在这章我们将仔细研究使用这种好东西的原因。
考虑在情景,你要从一个文本文件中读取多行并将每行逐一插入到SQL表中。一个最直接的处理方法是:

1、打开文本文件
2、从文本文件中读入一行
3、使用字符串连接来准备一个SQL语句:
sql = "INSERT INTO tablename(column1) VALUES (' " + line + " ')"
4、执行上面写好的SQL语句,数据库引擎难我们的语句是否符合SQL规则,编译并执行。
5、如果文本中还有其它行,再从第2步开始循环。

一个有SQL经验的人会注意到如果在上面第2步中读入的数据中含有引号('),那在第3步的处理中将发生错误,同样如果在文本行中有其它保留字符比如%、?、换行等也将会发生类似问题。为了避免这些问题,我们需要象以下一样重写第三步。
3、用字符串函数去格式化字符串,生成SQL语句。
sql = "INSERT INTO tablename(column1) VALUES (' " + EscapeSpecialChars(line) + " ')"

EscapeSpecialChars()函数用于编码或删除可能引起问题的字符。比如该函数将用两个单引号('')替代单引号('),并用相似的方法去处理%、?等字符。但问题是不同的数据库会有不同的认定要处理特殊字符的方法。
另一个问题是上面的处理方法要求我们必须在每一次构建SQL语句时都要小心翼翼的考虑周全,而事实上除了“line”变量每次有不同之外,其它的都是一模一样啊。新手们花费了大量的时间用于每一次的构建SQL语句上。首先要连接字符串构建SQL语句,其次数据库要在每次执行前都验证语句的合法性,这是一个要花费时间的步骤。既然每次只有一个line变量变动,那么就应该没有必要每次都重新验证或编译语句的啊。第三,这也容易造成SQL注入,心怀不轨的人可以通过SQL注入运行恶意的SQL语句。

一个更好的处理办法是使用参数工具,现代的数据库都有在明确传递一个SQL语句参数前进行编译的能力。可以通过传递不同的参数值来执行不同的语句。这能节省大量的时间,因为数据库引擎不需要每次都重复的验证和编译整个SQL语句,而仅仅是简单验证、编译并传入参数值就可以了。
使用参数的话,同样的问题就可以象以下这样进行解决:

1、用参数来准备一个SQL语句,并预先传给数据库引擎,数据库就象对一个真正的SQL语句一样来验证并编译成字节码,返回一个句柄,我们可以使用该句柄对这个语句进行参数传递。
2、打开文本文件
3、从文件中读入一行
4、通过从步骤1中得到的句柄进行参数传递,传入line,执行真正SQL语句。数据库早已验证并编译好了语句,所以马上用line替换了参数。
5、如果文本中还有其它行,再从步骤开始重复

既然数据库引擎已经一次性验证并编译好了语句,那么就不用在每一次执行语句前再重复了。如果你有大量的文本行,这将提高不少性能。额外的好处是步骤4中将自动处理特殊字符的问题,所以就没有必须每次使用EscapeSpecialChars()函数了,也杜绝了SQL注入攻击的可能。

也存在语句中指定多个参数的可能,这样你可以在一个语句中传入多个对应的参数值。你也可以为每个参数指定缺省值,这样如果你没有明确指定参数的时候,SQL语句将自动的使用缺省值。这在重复指定多个参数,但大部分参数值很少发生改变的时候特别有用。
参数也可以用于提供给存储过程,本指南将未满在SQL查询和存储过程中使用参数的方法。如你所见,每个严谨的程序员都应该充分发挥参数的优点。

论坛徽章:
0
5 [报告]
发表于 2008-09-12 22:01 |只看该作者
第四章:ADO和Python基础
在上面几章我们说过Python可以通过COM接口来使用ADO。要真的在Python中使用COM接口,你必须使用Mark Hammond提供的优秀的Python Windowsr扩展(Python for Windows Extensions),尤其是其中的Win32com模块。如果你还没有安装这个扩展,应该马上去下载并安装它。(译者注:建议安排ActivePython,一步到位)哦,对了,我好象已经提醒你这必须是运行在Windows平台上的吧。
在使用Mark Hammond的扩展的时候,你可以需要我提供的ADO常量,我已经把它放在一个名叫adoconstants.py的模块中了,并通过BSD类型许可进行发放。这个模块仅包含了一些你可能用得上的常量,通过常量名可以基本了解常量的作用。

一切安装到位后,就可以开始不一样的ADO征途了。所有的在以后章节中出现的代码都将在文件开始包含以下的代码:
   from win32com.client import Dispatch
    from adoconstants import *

我们使用"from adoconstants import *"代替"import adoconstants",只是为保持示例的整洁。
另一个关注的问题是对COM对象的晚绑定和早绑定,这不仅仅针对ADO,在Python中使用COM接口都会遇到这个问题。基本上有两个方法使Python的COM对象使用自己的方法和属性。这两种方法就叫着早绑定和晚绑定。如果一个Python的COM对象使用了晚绑定,那么每次你存取对象的方法和属性的时候,你不得不每次都通过IDispatch接口去查找它们,甚至在每次都呼叫同一方法或属性的时候。而早绑定,我们则让Python提前知道该对象中有那些属性和方法是可用的。则会使速度得到大的提升,尤其是在内部循环的时候。这一优化值得我们去使用。想要激活ADO对象的早绑定,我们需要导入ADO库:

在PythonWin中选择Tools->COM Makepy Utility
在出现的对话框中选择Microsoft ActiveX Data Objects Library。如果有多个版本出现,最很简单的是选择新新的版本。
点击OK按钮。PythonWin环境将停滞一会儿,ADO库被导入后,你将看到一个信息在活动的窗口,告诉你已生成了一个文件
这时你已经成功的生成了ADO的Python库,从现在起,Python能够自动的采取早绑定功能去使用ADO对象了。
你当然也可以不导入ADO库,但是为了性能考虑还是应该导入它的。现在,让我们继续探索如何在Python中使用不同的ADO对象。

论坛徽章:
0
6 [报告]
发表于 2008-09-12 22:04 |只看该作者
第五章:ADO连接对象
连接对象从数据源中获得数据要做的第一步。所有的ADO对象都使用连接对象来指向数据源,因此这也 是我们要生成的第一个对象,我们将首先去学习一些连接对象提供的属性和方法,看看如何从Python中调用他们。
下面的表格简单描述了连接对象的一些共用的属性,大部分的属性应该在连接被建立前就被指定赋值,这些属性控制着如何建立连接,下面的绿色部分是其中最有用的部分。
Property属性 Description描述
Attributes Sets/returns the attributes.赋值或返回一个属性
CommandTimeout Sets/returns the maximum number of seconds to wait for a command to complete. This value will be inherited by other ADO components that use this connection object, unless they override their value explicitly.
设置或返回等待一个命完成的最大秒数。这个属性将被所有使用这个连接属性的ADO组件所继承,除非你显式的改变该值
ConnectionString Sets/returns the parameters used for the connection. This is probably the most important property of them all, as it can be used to set all other properties instead of setting them one at a time. We will cover some examples below.
设置或返回连接用的参数。这个属性几乎是最重要的属性了,它可以用来一次性的设置所有的其它属性。在下面我们将提供一些示例。
CursorLocation Sets/returns the location of the cursor service. This property only applies to certain database engines.
设置或返回游标的位置,这个属性仅用于几个特定的数据库。
DefaultDatabase Sets/returns the default database name that the object switches to when it connects to the datasource.
设置或返回缺省的数据库名,当连接对象切换连接到其它数据库时使用。
IsolationLevel Sets/returns the transaction isolation level. Again, this may apply to only certain database engines.
设置或返回事务级别(??),同样的,只有几个特定的数据库使用
Mode Sets/returns the access permissions
设置或返回存取权限
Provider Sets/returns the provider name (i.e.) the driver to be used to connect to the DB.
设置或返回数据驱动提供者的名称,用于连接指定的数据库。
State Returns the state of the connection object, whether connected or not connected to the datasource.
返回连接对象的状态,是否已连接到数据源
Version Returns the version number of the ADO objects
返回ADO对象的版本。

下面我们将学习连接对象内置的方法,同上面一样,绿色部分的文本标示出了最重要的属性。
Property属性 Description描述
BeginTrans Begins a new transaction. Only useful if the datasource actually supports transactions, which not all engines do.
开始一个新的事务,并不是每一个数据引擎都支持该属性的,只有在支持事务处理的数据库中可用
Cancel Cancels the currently executing statement.
放弃正在执行的语句。
Close Closes the connection.
关闭连接
CommitTrans Commits all the changes made in the current transaction and then ends the transaction. You should have called BeginTrans first to start the transaction. Not all engines support transactions.
提交所有的事务改变并结束该事务,使用者应该先用BeginTrans方法来开始事务处理,并不是每个数据引擎都支持。
Execute Executes a query, stored procedure or a statement specific to the datasource.
执行一个查询、存储过程或者一个数据源提供的特殊语句。
Open Opens a connection to the datasource.
找打开一个数据源的连接。
OpenSchema Returns schema information about the datasource. This is not supported by all database engines, so you may end up with no information if your database doesn't support it.
返回一个数据源的计划信息。并不是每个数据库引擎都支持的,所以数据不支持时将不返回任何信息。
RollbackTrans Cancels any changes made in the current transaction and ends the transaction. Only applies if your database engine supports transactions. You should have called BeginTrans first also.
在当前事务中放弃所有的改变并结束该事务,只有在数据引擎支持事务时才行。同样应先调用BeginTrans方法。

使用连接对象的方法是先建立一个对象,然后再设置正确的属性(当然要信赖于你的数据库支持),再然后就调用Open()方法去连接真正的数据库。ConnectionString属性是其中最重要的属性了,其中一些个别的属性就象下面一样。

  oconn.Provider = "SQLOLEDB"
  oconn.CommandTimeout = 60

你可以使用ConnectionString属性同时设置所有的属性。所有你需要做的只是用分号(来分割每个参数:

  oconn.ConnectionString = "provider=SQLOLEDB; CommandTimeout=60; ... more properties ..."

ADO连接是建立在诸如ODBC、OLE DB、RDS等数据连接方法之上的。当然除了ConnectionString之外,其它任何的ADO组件都不关心是采用那种连接方式的。这是ADO向使用者提供的一个优势之一。

现在,看一看真正的Python代码,在本例中我们假设是采用OLEDB方式去连接SQL Server,在后面我们将展示更多的连接其它数据库的ConnectionString。这些代码都非常简单并提供了一些有用的注释,所以你应该能够毫无困难的看懂这些代码


  # First import two useful modules首先导入两个有用的模块
  from win32com.client import Dispatch
  from adoconstants import *

  # Create the ADO Connection object via COM.通过COM建立ADO连接对象
  oConn = Dispatch('ADODB.Connection')

  # Now set the connection properties via the ConnectionString
  # We're connecting to a SQL Server on 192.168.1.100 using OLEDB.
  # 现在通过设置ConnectionString属性来使用OLEDB方法连接位于192.168.1.100上的SQL Server
  oConn.ConnectionString = "rovider=SQLOLEDB.1;Data Source=192.168.1.100;" + \
      "uid=my_user_name;pwd=my_password;database=my_database_name"

  # Now open the connectionr打开这个连接
  oConn.Open()

  # Instead of setting the ConnectionString and then calling Open, it is also
  # possible to call the Open method directly and pass the connection string
  # as an argument to the method. {i.e.)
  # 作为这种先设置ConnectionString再调用Open()方法的替代操作,我们可以直接在Open
  # 方法中将ConnectionString作为参数提供给Open(),比如
  
  # oConn.Open("rovider=SQLOLEDB.1; Data Source=....."
  
  if oConn.State == adStateOpen:
      # Do something here总要干一些事情吧。
      print "We've connected to the database."
      # Execute a stored procedure.执行一个存储过程
      oConn.Execute("myStoredProcedure"
      # Execute an INSERT statement执行Insert(插入)语句。
      oConn.Execute("INSERT INTO table(col1, col2) VALUES (2, 'Test String')"
  else:
      print "We failed to connect to the database."

  # Close up the connection and unload the COM object
  # 关闭连接并,御下COM对象
  if oConn.State == adStateOpen: oConn.Close()
  oConn = None   


这是不是非常的简单啊?但也许你会说我没有使用SQL Server数据库啊,我使用的是其它数据库。那么你只有提供不同的ConnectionString就可以了,下面表中例举了一些常用数据库的常用连接方式的常用的ConnectionString。如果还没有找到你想要的,那么你可以通过Google搜索"ADO ConnectionString <你的数据库引擎名>"就可以了(译者注:永远不要忘了Google大神。-_-||)

Database Engine ConnectionString
DBASE (using ODBC) Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=C:\path\to\database
Excel (using ODBC) Driver={Microsoft Excel Driver (*.xls)};DriverID=790;Dbq=C:\path\to\spreadsheet;DefaultDir=C:\path\to\defaultdir
Excel (using OLE DB) Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Path\To\sheet.xls;
Access (using ODBC) Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\path\to\database.mdb;Uid=usernamewd=password

You can also pass additional options -- for example Exclusive=1; sets it to be opened in exclusive mode.
你可以提供附加的属性,比如Exclusive=1;来设置用独占的方式打开。
Access (using OLE DB) Using standard security
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\database.mdb;User Id=usernameassword=somepassword;

Using Workgroup security
str="rovider=Microsoft.Jet.OLEDB.4.0;DataSource=database.mdb;JET OLEDB:System Database=mysystem.mdw;"
oConn.Open(str, "my_user_name", "my_password"  
Firebird Remote Database
Provider='LCPI.IBProvider';Data Source='remotehost:C:\path\to\database.fdb';User ID='username'assword='pwd';Auto Commit=true;

The above is reported to work for a Firebird database by Edward Diamond (ediamond at water dot ca dot gov). I would presume that it could work on a local Firebird server, simply by removing "remotehost" from the string above. Edward reports that even simple queries don't work without the "Auto Commit" part in the connection string.
上面的字符串是由Edward Diamond(ediamond@water.ca.gov)提供的打开Firebird的方法,我假设你要打开的一个本地数据库,那只要简单的删除"remotehost"就可以了。Edward告诉我说如果没有"Auto Commit",那甚至连最简单的查询也无法正常工作。
MySQL (using ODBC) Local Database
Driver={MySQL ODBC 3.51 Driver};Server=localhost;User=usernameassword=mypassword;Database=mydatabase;

Remote Database
Driver={MySQL ODBC 3.51 Driver};Server=192.168.1.100ort=3306;User=usernameassword=mypassword;Database=mydatabase;

There are more parameters that can be set (for example, Option, which controls several connection properties such as logging, packet size limits etc.) See section 3.3 (Connection Parameters) of the MyODBC manual for more information.
有更多的参数可以被设置(比如数据库日志、包大小限制等),具体可以查看MyODBC手册中的3.3节(连接参数)来获得更多的信息。
MySQL (using OLE DB) Provider=MySQLProv;Server=192.168.1.100ort=3306;User=username;Password=mypassword;Database=mydatabase;

If you have the datasource already set up:
Provider=MySQLProv;Data Source=name_of_datasource;

You will need to download and install MyOleDB first. Last time I checked MyOLEDB was no longer maintained.
你需要先下载并安装MyOleDB,我最近一次查询结果是MyOLEDB已经不再维护了。
Oracle (using ODBC) Driver={Microsoft ODBC for Oracle};Server=MyOracleServer;Uid=username;Pwd=password

See the MSDN library for additional options.
查看MSDN获得更多信息。

Oracle (using OLE DB) Using OLE DB provider from Microsoft
Provider=MSDAORA;Data Source=MyOracleDB;User Id=username;Password=password
See the MSDN library for additional options.

Using OLE DB provider from Oracle
Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=username;Password=password

SQL Server (using ODBC) Standard Security
Driver={SQL Server};Server=192.168.1.100;Uid=username;Pwd=password;Database=dbname;

Trusted Connection
Simply add Trusted_Connection=yes to the above string.

See MSDN Library for more options.
查看MSDN获得更多信息。
SQL Server (using OLE DB) Provider=SQLOLEDB.1;Data Source=192.168.1.100;Uid=username;Pwd=password;Database=dbname;

See MSDN Library for more options.
查看MSDN获得更多信息。

论坛徽章:
0
7 [报告]
发表于 2008-09-12 22:08 |只看该作者
第六章:ADO记录集对象

记录集对象经常被用于得到一个查询或存储过程的返回结果。记录集对象经常被一个连接对象所赋值,用于保存自己获得的数据。ActiveConnection属性经常是被设置成连接对象。一个完整的包含记录集对象所有属性、方法的术语表是可以在MSDN中查询,所以我们在这儿将不再重复所有内容。我们将展示如何使用记录集对象进行基本的选择查询。下面的例子使用的是MySQL数据库,但是同样的代码可以很好的工作在其它数据库引擎上(如Access、SQL Server、Oracle等),而所要做的仅仅不过是改变ConnectionString的属性,其它的代码都可以不加考虑的用于其它数据库中。

  from win32com.client import Dispatch
  from adoconstants import *

  # Create Connection object and connect to database.
  # 建立连接对象并且连接到数据库中
  oConn = Dispatch('ADODB.Connection')
  oConn.ConnectionString = "Driver={MySQL ODBC 3.51 Driver};" + \
                           "Server=192.168.0.50ort=3306;" + \
                           "User=foobarassword=bigsecret;Database=mytestdb"
  oConn.Open()

  # Now create a RecordSet object and open a table
  # 进行建立一个记录集并打开一个表格。
  oRS = Dispatch('ADODB.RecordSet')
  oRS.ActiveConnection = oConn    # Set the recordset to connect thru oConn设置记录集通过oConn来连接
  oRS.Open("zipcode"             # Open a table called zipcode打开一个名叫zipcode的表
  # Can also use oRS.Open("zipcode", oConn) instead of setting ActiveConnection
  # 也可以用oRS.Open("zipcode",oConn)来代替ActiveConnection

  while not oRS.EOF:
      # Access individual fields by name -- all 4 methods are equivalent
          # 通过名字存取单个字段--下面的4个方法都是相同的
      print oRS.Fields.Item("city".Value, oRS.Fields("state", \
            oRS.Fields("zip".Value, oRS.Fields.Item("city"
      # Access individual fields by position -- all 4 methods are equivalent
          # 通过字段位置来存取单个字段值--下面的4个方法都是相同的
      print oRS.Fields.Item(0), oRS.Fields(1), \
            oRS.Fields(2).Value, oRS.Fields.Item(0).Value

      # Move to the next record in the RecordSet
          # 移动记录集的下一个记录
      oRS.MoveNext()

  # Close and clean up   
  # 关闭并清场
  oRS.Close()
  oRS = None

  oConn.Close()
  oConn = None   


如你所见,上面的示例是很容易理解的。下面一些例子将说明如果执行一个查询或存储过程。
使用代码打开一个查询或存储过程是很简单的,就象上面的例子。你做要做的就是在打开表格的地方(oRS.Open("zipcode")替换成下面的代码。其余的代码都是一样的。

  oRS.Open("SELECT zip, city, state FROM zipcode ORDER BY id"
  oRS.Open("SELECT zip, city, state FROM zipcode ORDER BY id", oConn)


  # Assuming we have an engine that supports stored procedures which return result sets,
  # such as SQL Server, we can call a stored proc as well. Here, the name of the stored
  # proc is assumed to be selZipCode
  # 现在假设我们的数据库引擎支持返回记录集的存储过程,比如SQL Server,我们将开始调用存储过程。
  # 下面假设这个存储过程的名字是selZipCode。
  oRS.Open("selZipCode"
  oRS.Open("selZipCode", oConn)
   
另一种建立记录集对象的方法是使用连接对象的Execute的方法。Execute方法通过查询或存储过程返回记录集对象。如果你使用这个方法,你不需要建立新的记录集对象或者指派它的ActiveConnection属性。

  # No Need to create a RecordSet object, so the next two lines are commented out
                # 不需要建立记录集对象,所以下面两行被注释掉了
  # oRS = Dispatch('ADODB.RecordSet')
  # oRS.ActiveConnection = oConn

  # Execute a query that returns a RecordSet
  # 执行一个返回记录集的查询
  (oRS, result) = oConn.Execute("SELECT zipcode, city, state FROM zipcode ORDER BY id"
  # Execute a stored proc that returns a RecordSet
  # 执行一个返回记录集的存储过程
  (oRS, result) = oConn.Execute("selZipCode"

   while not oRS.EOF:
        # rest of code
                # 其它代码不变
   
面的技术仅有于一些简单的查询,如果你有一个要构建象下面这样字符串的查询的话。

  sql = "SELECT zip, city, state FROM zipcode WHERE city = '" + cityvar + "' ORDER BY id"


如果cityvar中有单引号的话,将会出现问题了,象我们在第三章的讨论一样,最好的方法是使用参数技术,在下一章节中我们将展示如果使用命令对象中的参数技巧。

论坛徽章:
0
8 [报告]
发表于 2008-09-12 22:52 |只看该作者
这样也可以……等着遭BS吧……

论坛徽章:
0
9 [报告]
发表于 2008-09-12 23:08 |只看该作者

晕,不发了,打包上来

为Python发展做了贡献了
水平有限,权当抛砖引玉吧

[ 本帖最后由 iscien 于 2008-9-13 00:16 编辑 ]

adoprogram2_rar.zip

45.77 KB, 下载次数: 98

论坛徽章:
0
10 [报告]
发表于 2008-09-12 23:09 |只看该作者

adoconstants.py文件

#
# Module: ADOConstants
# Author: Mayukh Bose
# Version: 0.0.1
# Purpose: To contain constant names for various ADO operations. Note that this is
#          not a comprehensive list of all constants.
# Modifications (push down list):
# 2004-February-15 - Released module to the public
#
# Copyright (c) 2004, Mayukh Bose
# All rights reserved.

# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:

#    Redistributions of source code must retain the above copyright notice, this list
# of conditions and the following disclaimer.
#    Redistributions in binary form must reproduce the above copyright notice, this
# list of conditions and the following disclaimer in the documentation and/or other
# materials provided with the distribution.
#    Neither the name of Mayukh Bose nor the names of other contributors may be used to
# endorse or promote products derived from this software without specific prior written
# permission.
#
#    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.
   

#
# Data Type Constants
#

adEmpty                    = 0
adSmallInt                = 2
adInteger                = 3
adSingle                = 4
adDouble                = 5
adCurrency                = 6
adDate                    = 7
adBSTR                    = 8
adIDispatch                = 9
adError                    = 10
adBoolean                = 11
adVariant                = 12
adIUnknown                = 13
adDecimal                = 14
adTinyInt                = 16
adUnsignedTinyInt        = 17
adUnsignedSmallInt        = 18
adUnsignedInt       = 19
adBigInt                = 20
adUnsignedBigInt        = 21

adFileTime                = 64
adGUID                    = 72

adBinary                = 128
adChar                    = 129
adWChar                    = 130
adNumeric                = 131
adUserDefined            = 132
adDBDate                = 133
adDBTime                = 134
adDBTimeStamp            = 135
adChapter                = 136
adDBFileTime            = 137
adPropVariant            = 138
adVarNumeric            = 139

adVarchar                = 200
adVarChar           = 200
adLongVarChar            = 201
adVarWChar                = 202
adLongVarWChar            = 203
adVarBinary                = 204
adLongVarBinary            = 205


#
# Connection State Constants
#
adStateClosed            = 0
adStateOpen                = 1
adStateConnecting        = 2
adStateExecuting        = 4
adStateFetching            = 8

#
# CursorType constants
#
adOpenUnspecified   = -1
adOpenForwardOnly   = 0
adOpenKeyset        = 1
adOpenDynamic       = 2
adOpenStatic        = 3

#
# LockType constants
#
adLockUnspecified   = -1
adLockReadOnly      = 1
adLockPessimistic   = 2
adLockOptimistic    = 3
adLockBatchOptimistic = 4

#
# ExecuteOption constants
#
adOptionUnspecified = -1
adAsyncExecute      = 16
adAsyncFetch        = 32
adAsyncFetchNonBlocking = 64
adExecuteNoRecords  = 128

#
# CursorLocation constants
#
adUseNone           = 1
adUseServer         = 2
adUseClient         = 3
adUseClientBatch    = 3

#
# ParameterDirection constants
#
adParamUnknown      = 0
adParamInput        = 1
adParamOutput       = 2
adParamInputOutput  = 3
adParamReturnValue  = 4

#
# ParameterAttributes constants
#
adParamSigned       = 16
adParamNullable     = 64
adParamLong         = 128

#
# CommandType constants
#
adCmdUnspecified    = -1
adCmdText           = 1
adCmdTable          = 2
adCmdStoredProc     = 4
adCmdUnknown        = 8
adCmdFile           = 256
adCmdTableDirect    = 512
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP