本站首页    管理页面    写新日志    退出


«November 2019»
12
3456789
10111213141516
17181920212223
24252627282930


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:VFP及Sql Server拙笔
日志总数:46
评论数量:107
留言数量:0
访问次数:385079
建立时间:2005年5月12日




[VFP与SQL]在Visual FoxPro中使用ADO数据源
文章收藏,  网上资源,  读书笔记,  软件技术

老瓷 发表于 2006-2-14 0:14:37

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所示。500)this.width=500'>图20-60 选择“文件DSN”选项卡500)this.width=500'>图20-61 选择SQL Server驱动程序500)this.width=500'>图 20-62 输入数据源名称500)this.width=500'>图20-63 单击“完成”按钮500)this.width=500'>图20-64 选择数据库服务器500)this.width=500'>图20-65 输入登录ID及密码500)this.width=500'>图20-66 选择数据库500)this.width=500'>图20-67 单击“完成”按钮500)this.width=500'>图20-68 数据源设置选项列表500)this.width=500'>图20-69 设置完成后数据源显示在列表中下面便可以使用这个文件数据源建立一个ADO连接,代码如下:LOCAL oConn AS ADODB.ConnectionoConn=CREATEOBJECT("ADODB.Connection") 建立连接对象oConn.Open("FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\LinkNorthwind.dsn","sa","")如果以字符串方式连接,有两种方式可选择:一种是ODBC方式,一种是OLEDB方式。文件数据源文件实际就是一个文本文件,在其中保存了服务器名称和数据库名称等内容,定位到文件数据源的保存位置,使用记事本打开该文件,如图20-70所示。500)this.width=500'>图20-70 文件数据源中的内容因此,可以在连接对象中Open方法中直接使用其中的内容以ODBC方式打开连接,代码如下:LOCAL oConn AS ADODB.ConnectionoConn=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.ConnectionoConn=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参数可用值可用值 说明-1  不指定游标类型0   前滚静态游标。只能向前浏览记录集合,例如,用MoveNext可以向前滚动。这种方式可以提高浏览速度,但不能使用BookMark、RecordCount、AbsolutePosition或AbsolutePage等1   键集合游标。类似动态游标,可以看见其他用户对记录集合中记录的修改,但是不能看见其他用户添加的记录2   动态游标。所有对记录集合的操作都会立即在各用户记录集上反应出来3   静态游标。它为记录集产生一个静态备份,但其他用户的新增、删除、更新操作不影响该记录集,这类似Visual FoxPro的私有数据工作期表20-14 LockType参数可用值 可用值 说明-1  不指定锁定类型1   只读记录集合,不能改变数据2   悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制3   乐观锁定方式。只在调用Update方法时才锁定记录,在此之前仍然可以做数据的更新、插入、删除等动作4   乐观批量更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成表20-15 Options参数可用值可用值 说明-1  不指定命令类型1   指定Source作为一个命令或存储过程的原始定义进行调用2   指定Source是一个表名称,列由内部已生成的SQL查询返回4   指定Source是一个存储过程8   默认值,表示在Source中的命令未知256  指定Source作为一个持续存储的RecordSet的文件名称512  指定Source是一个表名称来看一个比较完整的获取记录集合的代码:LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSetcString="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 记录集合对象的常用属性及方法属性/方法    说明oRs.RecordCount  数值型。返回集合的记录数目oRs.Fields.Count  数值型。返回集合的字段数目oRs.Fields(n).Name  字符型。返回集合中第n个字段的字段名称,其中n为0表示第1个字段,n为1表示第2个字段,依次类推,最大值为oRs. Fields.Count-1oRs.Fields(n).DataType  数值型。返回字段的数据类型,ADO数据类型如表20-17所示oRs.Fields(n).Value 或oRs.Fields(cFieldName).Value 返回集合中第n个字段的值。也可以在知道字段名称的情况下,直接使用字段名称cFieldName来代替noRs.EOF   逻辑型。判断是否已到集合尾部,返回.T.,表示已到集合尾部oRs.MoveFirst   将指针移动到集合的第一条记录oRs.MoveLast   将指针移动到集合的最后一条记录oRs.MovePrev   将指针向前移动一条记录oRs.MoveNext   将指针向后移动一条记录oRs.PageCount  数值型。返回集合的页数。ADO每次不是将集合中的全部数据下载到本地,而是按页下载,这类似于远程视图中的按需下载oRs.PageSize   数值型。返回页大小oRs.Properties.Count  数值型。返回集合的属性设置数目oRs.Properties(n).Name  字符型。返回集合的第n个属性的名称,其中n为0表示第1个属性,n为1表示第2个属性,依次类推,最大值为oRs.Properties.Count-1oRs.Properties(n).Value  返回集合的第n个属性的值oRs.Requery   重新执行查询oRs.Close   关闭集合表20-17 ADO数据类型常数    值 描述AdArray(不应用于ADOX)  0x2000 这是一个标志值,是一个表示其他数据类型的数组adBigInt   20 8字节带符号整数adBinary   128 二进制值adBoolean   11 逻辑值adBSTR   8 空终止的字符串(Unicode)adChapter   136 章节类型,表示一个子记录集adChar   129 字符串值adCurrency   6 货币值,8字节有符号整数,范围到10000,小数点后4位adDate   7 日期值,一个双精度数,其整数表示自1899年12月30日起的天数,其小数部分是当日的分数adDBDate   133 日期值(yyyymmdd)adDBTime   134 时间值(hhmmss)adDBTimeStamp  135 日期时间标志(yyyymmddhhmmss加12位小数)adDecimal   14 表示固定精度和范围的精确数值adDouble   5 一个双精度浮点值adEmpty   0 没有值被指定adError   10 32位错误代码adFileTime   64 DOS/Win32下的文件时间,数值为自1601年1月1日起100纳秒数adGUID   72 全局唯一的标识符adIDispatch   9 一个指向OLE对象上IDispatch接口的指针,该类型现在不被ADO支持adInteger   3 4字节有符号整数adIUnknown   13 一个指向OLE对象上的IUnknown接口的指针,该类型现在不被ADO支持adLongVarBinary  205 长二进制值adLongVarChar  201 长字符串值adLongVarWChar  203 长空终止字符串值adNumeric   131 有固定精度和范围的精确数值adPropVariant   138 一个Variant(与一个自动化Variant不等价)adSingle   4 单精度浮点值adSmallInt   2 2字节有符号整数adTinyInt   16 1字节有符号整数adUnsignedBigInt  21 8字节无符号整数adUnsignedInt  19 4字节无符号整数adUnsignedSmallInt  18 2字节无符号整数adUnsignedTinyInt  17 1字节无符号整数adUserDefined  132 用户自定义变量adVarBinary   204 二进制值adVarChar   200 字符串值adVariant   12 自动化Variant,该类型现在不被ADO支持adVarNumeric   139 表示一个可变宽度的精确数,有符号的范围值adVarWChar   202 空终止Unicode字符串adWChar   130 空终止Unicode字符串3.建立命令(Command)对象Command对象特定地为处理各种类型的命令而设计,特别是那些需要参数的命令。与Connection对象相似,Command对象可以运行返回记录集和不返回记录集两种类型的命令。实际上,如果命令不含有参数,那么它并不关心是使用Connection对象,还是Command对象或Recordset对象。下面的命令将建立一个Command对象:oCmd=CREATEOBJECT("ADODB.Command")要返回一个记录集合,可以使用Command对象的Execute方法。但是,与Connection对象不同的是,必须在Command对象的CommandText属性中设置命令文本,而不能在Execute方法中直接使用命令文本。Execute方法的语法格式如下:oCmd.Execute(RecordsAffected, Parameters, Options)其中,RecordsAffected是受命令影响的记录数;Parameters参数值数值;Options是命令选项,与Recordset对象Open方法中的Options选项相似,请见表20-15所示。下面的代码是一个利用Command对象进行简单SELECT查询的示例。LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet,oCmd AS ADODB.CommandcString="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).ValueoRs.MoveNext ENDDO 从上面的代码可以看出,使用Command对象进行查询是比较烦琐的,并且所返回的记录集合默认是只读的。可以使用RecordSet对象的CursorType和LockType属性进行重新设置,这两个属性的可用值请参见前面的表20-13和表20-14。例如,下面在的语句在建立RecordSet对象后将集合设置成了静态游标和乐观锁定方式,这样就成为了一个可更新记录集合。oRs.CursorType=3 静态游标oRs.LockType=3 乐观锁定使用Command对象的最大好处是可以为查询命令或存储过程传递参数值,实现参数化查询。要为Command对象建立参数,需要使用Command对象的CreateParameter方法,语法格式如下: oCmd.CreateParameter (Name, Type, Direction, Size, Value)其中,Name是一个包含参数对象名称的字符串值;Type指定参数对象的数据类型,可用值如表20-17所示;Direction指定参数对象的类型,可用值如表20-18所示;Size指定参数值的最大字符或字节长度;Value指定参数的值。 表20-18 Type参数的可用值常量     值    说明adParamInput   1    默认值。表示为输入参数adParamInputOutput 3    表示为输出、输出参数adParamOutput   2    表示为输出参数adParamReturnValue 4    表示为返回值adParamUnknown  0    表示为未知参数该方法执行成功后将返回一个参数对象,可以使用Command对象的Parameters集合的Append方法将该参数对象添加到Command对象中。在下列代码中,可以为查询命令传递两个参数cCountry和cCustomerID,参数将按照建立的顺序传递给查询语句。请注意其中为参数赋值的两种方法:一种是直接使用CreateParameter方法Value参数;另一种是在建立参数对象后,使用Parameters集合指定。LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSet,oCmd AS ADODB.CommandcString="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=oConnoCmd.CommandText="SELECT * FROM Customers WHERE Country=? AND CustomerID=?" 参数化查询命令oCmd.Parameters.Append(oCmd.CreateParameter("cCountry",129,1,10,"Brazil")) 直接为cCountry指定了参数值BraziloCmd.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").ValueoRs.MoveNext ENDDO4.发送更新在将游标中的数据修改后,可以使用RecordSet对象的Update或UpdateBatch方法进行发送更新,保存修改。其中,UpdateBatch方法用于在游标的LockType属性设置为4时进行批量发送更新。例如,下面的代码首先取得CustomerID为FAMIA的顾客信息,然后将其CompanyName字段值修改为“人民邮电出版社”,发送更新后并重新查询,可看到记录已经被保存。LOCAL oConn AS ADODB.Connection,cStrung AS Character,oRs AS ADODB.RecordSetcString="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=1oRs.Fields("CompanyName").Value="人民邮电出版社" 修改字段值oRs.Update() 发送更新 oRs.Requery() 重新执行查询?oRs.Fields("CompanyName").Value 显示修改后的字段值ENDIF


阅读全文(9532) | 回复(2) | 编辑 | 精华
 


回复:在Visual FoxPro中使用ADO数据源
文章收藏,  网上资源,  读书笔记,  软件技术

nintang(游客)发表评论于2010-4-22 23:15:41

麻烦发图片给我,好么。谢谢!E-Mail:nintang@163.com


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:在Visual FoxPro中使用ADO数据源
文章收藏,  网上资源,  读书笔记,  软件技术

ztzxh(游客)发表评论于2009-7-23 9:19:40

不能看到图片,麻烦你发一个有图片的文档给我。谢谢了!EMALI:ZTZXH@126.COM 再次表示感谢。

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144327126 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号