在Visual FoxPro中使用ADO数据源

来源:互联网 发布:国外的聊天软件 编辑:程序博客网 时间:2024/04/25 23:32
专栏作品
在Visual FoxPro中使用ADO数据源
张洪举
ADO是一种面向对象的数据连接方式,与ODBC有着许多相似之处。使用ADO作为数据源,首先需要一个建立一个连接对象(ADO Connection),这类似于ODBC的连接句柄;然后需要建立一个记录集合对象(ADO RecordSet),用于存放读取的数据,这类似于Visual FoxPro的临时表;最后便是使用记录集合的Open方法根据建立的连接对象,执行一个SQL查询语句,这类似SPT的SQLEXEC( )函数,该函数也是根据一个连接句柄来执行一个SQL查询。
1.建立连接(Connection)对象
ADO也同样支持ODBC数据源与字符串连接方式,如果使用ODBC数据源连接,可以建立一个文件数据源,步骤如下:
(1)在“控制面板”中打开“ODBC数据源管理器”对话框,并选择“文件DSN”选项卡,如图20-60所示。
(2)单击对话框中的“添加”按钮,打开“创建新数据源”对话框,在驱动程序列表中选择SQL Server,如图20-61所示。
(3)单击“下一步”按钮,将出现如图20-62所示的画面,可以在文本框中输入要建立的数据源名称,如:LinkNorthwind。也可以单击文本框后面的“浏览”按钮选择数据源文件保存的路径,默认为“c:/Program Files/Common Files/ODBC/Data Sources/”。
(4)单击“下一步”按钮,将出现如图20-63所示的画面。
(5)单击“完成”按钮,将出现如图20-64所示的“创建到SQL Server的新数据源”对话框。可以在“描述”文本框中输入对连接的说明,并在“服务器”下拉列表中选择好数据库服务器。
(6)单击“下一步”按钮,在出现的20-65所示的画面中选择SQL Server验证,并输入登录ID及密码。
(7)单击“下一步”按钮,在出现的20-66所示的画面中选择要连接的数据库,如:Northwind。
(8)单击“下一步”按钮,在出现的20-67所示的画面中可以选择系统消息语言等选项。
(9)单击“完成”按钮,将显示图20-68所示的数据库连接选项列表。可以单击“测试数据源”按钮测试是否已经连接成功,单击其中的“完成”按钮,完成设置,返回到“ODBC数据源管理器”对话框,如图20-69所示。
图20-60 选择“文件DSN”选项卡
图20-61 选择SQL Server驱动程序
图 20-62 输入数据源名称
图20-63 单击“完成”按钮
图20-64 选择数据库服务器
图20-65 输入登录ID及密码
图20-66 选择数据库
图20-67 单击“完成”按钮
图20-68 数据源设置选项列表
图20-69 设置完成后数据源显示在列表中
下面便可以使用这个文件数据源建立一个ADO连接,代码如下:
      LOCAL oConn AS ADODB.Connection      oConn=CREATEOBJECT("ADODB.Connection")   建立连接对象      oConn.Open("FILEDSN=C:/Program Files/Common Files/ODBC/Data Sources/LinkNorthwind.dsn","sa","")      
如果以字符串方式连接,有两种方式可选择:一种是ODBC方式,一种是OLEDB方式。
文件数据源文件实际就是一个文本文件,在其中保存了服务器名称和数据库名称等内容,定位到文件数据源的保存位置,使用记事本打开该文件,如图20-70所示。
图20-70 文件数据源中的内容
因此,可以在连接对象中Open方法中直接使用其中的内容以ODBC方式打开连接,代码如下:
      LOCAL oConn AS ADODB.Connection      oConn=CREATEOBJECT("ADODB.Connection")   建立连接对象      oConn.Open("DRIVER=SQL Server;UID=sa;PWD=;DATABASE=Northwind;SERVER=ccb-zhj")      
从上面介绍的两种连接方式,可以看出,ADO实际上是基于ODBC的一种应用程序,它提供了面向对象的数据调用方式。但是,OLEDB又是什么呢?OLEDB是位于ODBC层与应用程序之间的一个数据访问组件,也就是说,可以在ADO和ODBC之间使用OLEDB进行连接,多出了一个中间层。数据通过ADO调用,先被送到OLEDB,然后再交由ODBC处理。使用OLEDB可以提高数据的访问性能。下面是使用OLEDB连接到SQL Server数据库的代码:
      LOCAL oConn AS ADODB.Connection      oConn=CREATEOBJECT("ADODB.Connection")   建立连接对象      oConn.Open("Provider=SQLOLEDB.1;Data Source=ccb-zhj;Initial Catalog=Northwind;UID=sa;PWD=;      Trusted_Connection=NO")      
连接建立后,便可以使用连接对象的Execute方法执行一个SQL查询语句,建立一个简单的记录集合对象。为更好地解释这种连接过程,我们将其与SPT连接方式进行了比较,如表20-12所示。
表20-12 使用ADO与SPT获取数据比较
ADO方式
      *!* 声明变量      LOCAL oConn AS ADODB.Connection,;      cStrung AS Character,oRs AS ADODB.RecordSet      *!* 建立连接字符串      cString="Provider=SQLOLEDB.1;Data Source=ccb-zhj;"+;      "Initial Catalog=Northwind;"+;      "UID=sa;PWD=;Trusted_Connection=NO"      *!* 建立连接对象      oConn=CREATEOBJECT("ADODB.Connection")       oConn.Open(cString)    打开连接      *!* 执行查询,结果保存到oRs记录集合对象中      oRs=oConn.Execute("SELECT * FROM Customers")>      *!* 显示记录集合的第1个字段的值      DO WHILE NOT oRs.EOF       ?oRs.Fields(0).Value   显示字段值      oRs.MoveNext       向下移动一条记录      ENDDO            *!*显示集合的字段数      ?oRs.Fields.Count      *!* 关闭连接对象,会同时关闭对象集合      oConn.Close      
SPT方式
      *!* 声明变量      LOCAL nHandle AS Number,cString AS Character       *!* 建立连接字符串      cString="Driver=SQL Server;Server=ccb-zhj;"+;      "UID=sa;PWD=;Database=Northwind"      *!* 建立连接句柄      nHandle=SQLSTRINGCONNECT(cString)      *!* 执行查询,结果保存到curRs临时表中      =SQLEXEC(nHandle,"SELECT * FROM Customers","curRs")      *!* 显示临时表的第1个字段的值      DO WHILE NOT EOF()      ?EVALUATE(FIELD(1))  显示字段值      SKIP                   向下移动一条记录      ENDDO       *!* 显示临时表的字段数      ?FCOUNT()      *!* 关闭临时表      USE IN curRs      
请注意上述代码中,ADO的Fields对象以0来标识记录集合的第1个字段,Visual FoxPro的FIELD( )函数以1来标识表的第1个字段。
2.建立记录集合(RecordSet)对象
虽然使用连接对象的Execute方法可以将查询结果保存到一个记录集合中,但是,这个集合对记录的控制是有限的。例如,在上面建立的oRs记录集合中,无法使用oRs.MoveLast方法(类似于Visual FoxPro的GO BOTTOM命令)将指针直接移动到记录集合的尾部。因此,为了更精确地跟踪数据,要用RecordSet对象创建包含数据的游标(类似于Visual FoxPro的临时表)。
例如,下面的代码建立了一个RecordSet对象:
oRs=CREATEOBJECT("ADODB.RecordSet")
可以使用RecordSet对象的Open方法建立一个游标,Open方法的语法格式如下:
oRs.Open(Source, ActiveConnection, CursorType, LockType, Options)
其中,Source是一个可以确立为Command对象的变量,可以是一个SQL语句、存储过程或表名称等;ActiveConnection是已经建立好的连接;CursorType是游标的类型,可用值如表20-13所示;LockType指定锁定类型,可用值如表20-14所示;Options用于指定Source的类型,用以确定Source指定的是一个SQL语句还是一个存储过程等,可用值如表20-15所示。
表20-13 CursorType参数可用值
表20-14 LockType参数可用值
表20-15 Options参数可用值
来看一个比较完整的获取记录集合的代码:
      LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet      cString="Provider=SQLOLEDB.1;Data Source=ccb-zhj;Initial Catalog=Northwind;UID=sa;PWD=;      Trusted_Connection=NO"      oConn=CREATEOBJECT("ADODB.Connection")      建立连接对象      oConn.Open(cString)                              打开连接      oRs=CREATEOBJECT("ADODB.RecordSet")         建立记录集合对象      oRs.Open("SELECT * FROM Customers",oConn,1,3,1)  读取数据,建立游标      ?oRs.RecordCount                                显示记录数      
记录集合对象的常用属性及方法如表20-16所示。
表20-16 记录集合对象的常用属性及方法
表20-17 ADO数据类型
3.建立命令(Command)对象
Command对象特定地为处理各种类型的命令而设计,特别是那些需要参数的命令。与Connection对象相似,Command对象可以运行返回记录集和不返回记录集两种类型的命令。实际上,如果命令不含有参数,那么它并不关心是使用Connection对象,还是Command对象或Recordset对象。下面的命令将建立一个Command对象:
oCmd=CREATEOBJECT("ADODB.Command")
      LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet,oCmd AS ADODB.Command      cString="Provider=SQLOLEDB.1;Data Source=ccb-zhj;Initial Catalog=Northwind;UID=sa;PWD=;      Trusted_Connection=NO"      oConn=CREATEOBJECT("ADODB.Connection")      建立连接对象      oConn.Open(cString)                              打开连接      oCmd=CREATEOBJECT("ADODB.Command")       建立Command对象      oCmd.ActiveConnection=oConn                     设置活动连接      oCmd.CommandText="SELECT * FROM Customers"   设置命令      oRs=oCmd.Execute()            DO WHILE NOT oRs.EOF       ?oRs.Fields(0).Value      oRs.MoveNext       ENDDO                    
      oRs.CursorType=3    静态游标      oRs.LockType=3     乐观锁定      
表20-18 Type参数的可用值
      LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet,oCmd AS ADODB.Command      cString="Provider=SQLOLEDB.1;Data Source=ccb-zhj;Initial Catalog=Northwind;UID=sa;PWD=;      Trusted_Connection=NO"      oConn=CREATEOBJECT("ADODB.Connection")      建立连接对象      oConn.Open(cString)                              打开连接      oCmd=CREATEOBJECT("ADODB.Command")      oCmd.ActiveConnection=oConn      oCmd.CommandText="SELECT * FROM Customers WHERE Country=? AND CustomerID=?"  参数化查询命令      oCmd.Parameters.Append(oCmd.CreateParameter("cCountry",129,1,10,"Brazil"))  直接为cCountry指定了参数值Brazil      oCmd.Parameters.Append(oCmd.CreateParameter("cCustomerID",129,1,10)) 未指定      参数值oCmd.Parameters("cCustomerID")="FAMIA" 指定cCustomerID的参数值      oRs=oCmd.Execute()            DO WHILE NOT oRs.EOF       ?oRs.Fields(0).Value+SPACE(10)      ??oRs.Fields("Country").Value      oRs.MoveNext       ENDDO      
      LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet      cString="Provider=SQLOLEDB.1;Data Source=ccb-zhj;Initial Catalog=Northwind;UID=sa;PWD=;      Trusted_Connection=NO"      oConn=CREATEOBJECT("ADODB.Connection")      建立连接对象      oConn.Open(cString)                              打开连接      oRs=CREATEOBJECT("ADODB.RecordSet")         建立记录集合对象      oRs.Open("SELECT * FROM Customers WHERE CustomerID='FAMIA'",oConn,1,3,1)  读取数据,建立游标      ?oRs.Fields("CompanyName").Value                      显示当前字段值      IF oRs.RecordCount=1      oRs.Fields("CompanyName").Value="人民邮电出版社"  修改字段值      oRs.Update()                                     发送更新       oRs.Requery()                                    重新执行查询      ?oRs.Fields("CompanyName").Value                  显示修改后的字段值      ENDIF