| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1547 人关注过本帖
标题:[推荐]如何让 SQL Pass-Through 游标可更新
只看楼主 加入收藏
honrry
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2004-6-2
收藏
 问题点数:0 回复次数:2 
[推荐]如何让 SQL Pass-Through 游标可更新

概述

VFP 的 SQLEXEC() 函数允许通过 ODBC 从任何数据源下载数据. 与远程视图不同, SQL Pass-Through 方法没有提供默认的 (自动) 设置来在客户端的游标中的数据改变后从返回的游标更新服务器的数据. 但是, 可以自定义更新所必须的属性来达到更新的目的.

首先, 建议阅读 MSDN 中关于 SQL Pass Through 命令的章节, 特别是解释本文中使用的属性的章节: Tables, KeyFieldList, UpdatableFieldList, UpdateNameList, SendUpdates. 这五个属性是更新远程数据所需要的基本属性.

本文只是一个让 MS SQL Server ODBC 数据源 SPT 游标可更新的例程的源代码. 因数据库的格式表和字段的规范不同, 因此它会需要修改以适应其它数据源. 另外, 示例是非常简单和缺乏处理一些如字段包含空格和一些可能的问题. 这是一个你可以用来改进的示例. 它以概不负责的方式提供.

很容易看到为准备这五个属性来使游标可更新必须的格式. 创建一个简单的数据库, 在数据库中连接到数据源, 然后用必要的 (或简单的) 查询创建视图. 打开视图并用 CursorGetProp() 函数来查看提及的五个属性中保存了什么. 这将给你很多关于你将如何为 SQL Pass-Through 准备这些属性的信息.

只要你愿意你可以组织在服务器上更新你的数据. 例如, 从一个表中或视图中查询数据, 并更新数据到另一个表. 在后端映射字段到另一个字段. 创建不是由查询返回的, 在客户端预填充并只用于更新数据的自定义字段. 用非常复杂的 SELECT 语句查询数据, 执行 SELECT 语句, T-SQL 脚本或储存过程, 然后从客户端更新数据 (这在远程视图中是完全不可能的, 但 SQL Pass-Through 确是可能的).

描述

 

* 转换 SQL Path Through 游标或远程视图游标为可更新的和 fetchable 游标. * 参数: 游标名 (必需) * ID 字段名 (必需) * SQL server 上的源表名 (必需) * 逗号分隔的字段,表达式字段列表 (可选) * logical .T. 是否 ID 字段也是可更新的. (可选) * NOTE - 要正确地使用该例程, 所有游标中的字段应该与服务器上的字段匹配. * NOTE2 - 你可以手动地指定 "UpdateNameList" 来匹配游标字段和服务器上的字段. * 该列表必须是以下格式: * {游标字段} {服务器表}.{服务器字段}[, ...] * 注意 '','' 后的空格.

lparameters pcCursorName, pcIDFieldName, pcSourceTables, pcNONUpdatableFields,; plUpdateIDField

if cursorgetprop(''SourceType'', m.pcCursorName)#2 * 游标不兼容 return .F. endif if !empty(cursorgetprop("Tables",m.pcCursorName)) * 已经是可更新的了 return .T. endif

m.pcSourceTables = chrtran(m.pcSourceTables, '' '', '''') local llResult, lnFCount, lcFieldsList, lcField, lcKeyField, m.lcUPDFieldsList, lcNewList m.llResult = CursorSetProp("Tables", ; iif("." $ m.pcSourceTables, m.pcSourceTables, ; substr( STRTRAN( '','' + m.pcSourceTables, '','', '',dbo.''), 2) ), m.pcCursorName)

if m.llResult && prepare strings for exact substring search if !(vartype(m.pcNONUpdatableFields) == "C") m.pcNONUpdatableFields = "" endif if !empty(m.pcNONUpdatableFields) m.pcNONUpdatableFields = '','' + upper(chrtran(m.pcNONUpdatableFields,'' '','''')) + '','' endif m.pcIDFieldName = chrtran(m.pcIDFieldName,'' '','''') m.lcKeyField = '','' + upper(m.pcIDFieldName) + '',''

if '','' $ m.pcSourceTables m.pcSourceTables = left(m.pcSourceTables,at('','',m.pcSourceTables)-1) endif if ''.'' $ m.pcSourceTables m.pcSourceTables = substr(m.pcSourceTables, at(''.'',m.pcSourceTables)+1) endif

m.lcFieldsList = '''' && fields for UPDATENAMELIST m.lcUPDFieldsList = '''' && fields for UPDATABLEFIELDLIST for m.lnFCount = 1 to FCOUNT(m.pcCursorName) m.lcField = FIELD(m.lnFCount, m.pcCursorName) if !('','' + m.lcField + '','' $ m.pcNONUpdatableFields) m.lcFieldsList = m.lcFieldsList + '','' + m.lcField + '' dbo.'' +; m.pcSourceTables + ''.'' + m.lcField if !('','' + m.lcField + '','' $ m.lcKeyField) m.lcUPDFieldsList = m.lcUPDFieldsList + '','' + m.lcField endif endif endfor

m.lcNewList = cursorgetprop("UpdateNameList", m.pcCursorName) if !empty(m.lcNewList) and ''.'' $ m.lcNewList m.lcNewList = STRTRAN(m.lcNewList, '', '', '','') m.lcNewList = STRTRAN(m.lcNewList, '' '', '' dbo.'') m.llResult = CursorSetProp("UpdateNameList", ; STRTRAN(m.lcNewList, '','', '', ''), ; m.pcCursorName) else m.llResult = CursorSetProp("UpdateNameList", substr(m.lcFieldsList, 2),; m.pcCursorName) endif if m.llResult m.llResult = CursorSetProp("KeyFieldList", m.pcIDFieldName, m.pcCursorName) if m.llResult m.llResult = CursorSetProp("UpdatableFieldList",; substr(m.lcUPDFieldsList,2), m.pcCursorName) if m.llResult m.llResult = CursorSetProp("SendUpdates", .T., m.pcCursorName) endif endif endif endif return m.llResult

搜索更多相关主题的帖子: SQL 游标 服务器 属性 数据 
2004-06-14 01:45
honrry
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2004-6-2
收藏
得分:0 
ADO数据访问一点通 对于ADO(ActiveX Data Object),大家已经听得比较多了,但对于ADO的实际应用,可能就没那么清楚了。今天我就来讲一讲ASP处理数据用的组件ADO,看过之后你就知道它原来是那么简单。

  首先让我们看看如何用ASP结合connection属性创建一个数据库连接。

  字符串形式连接一个ACCESS库 <% dim conn dim connstr dim db db="vip.mdb" Set conn = Server.CreateObject("ADODB.Connection") ’创建一个Connection属性的对象conn connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"") ' connstr="driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath(""&db&"") ' connstr="driver={SQL Server};server=localhost;UID=sa;PWD=;database=club" conn.Open connstr ’用conn.对象的open方法创建一个对数据库的连接 %>   代码中conn的open方法是打开一个连接用的,后边跟一个字符串。driver={SQL Server}的意思是,连接的是一个SQL Server的库,server=localhost中的localhost代表的是本机的IP,你的数据库服务器IP是多少,这里就改成相应的值,UID和PWD这两个是登录数据库服务器的用户名和密码,最后一个选项是你要操作的数据库的名字。

  好了,数据库我们连接上了,下边该讲一下如何读取数据了。

  首先让我们来创建一个recordset属性的对象set rs=server.CreateObject ("ADODB.Recordset"),然后用对象rs来打开一个记录集。 rs.open “Select * from tablename where uid=’Coolshow’”,conn,1,1

  这是用对象rs的open方法打开一个记录集,后边跟了三个参数用逗号分开。第一个参数是选取数据用的T-SQL语句。第二个是我们已经创建好连接的connection属性的对象conn。最后边两个参数用法比较多,如果只读取数据,设置“1,1”就足够了,如果要添加数据,设置“1,2”,如果要改写数据最好设置“2,3”,这两个参数一定要切记。好了,现在让我们来对数据做些处理吧。

  一、显示数据

< % set conn=server.CreateObject ("adodb.connection") conn.Open "driver={SQL Server};server=localhost;UID=username;PWD=password;database=dataname" set rs=server.CreateObject ("ADODB.Recordset") rs.open “Select * from tablename where uid=’Coolshow’”,conn,1,1 if rs.eof and rs.bof then ’如果数据指针同时指到记录集的头部和尾部,说明这时候记录集为空 response.write“没有可以显示的数据” ’打印“没有可以显示的数据” do until rs.EOF ’循环 直到记录集尾部为止 response.write rs(“字段1名”) ’显示一个行的一个字段 response.write rs(“字段2名”) ’同上 response.write rs(“字段3名”) ’同上 response.write “ ” ’一个行打印完毕,换行 rs.MoveNext ’将数据指针移到下一个行 loop ’循环结束 % >

  rs.bof,rs.eof和rs.movenext这三个方法都是跟数据指针有关的,前两个rs.bof和rs.eof用来判断数据指针是否在记录集的开始或者末尾,它们都会返回一个布尔值。rs.movenext跟前两个就大不相同了,它是用来控制数据指针的,让指针移动到下一位,我们能把一个表的多个行显示出来也就是靠它。

  二、添加数据 < % ……’代码与前同,略 rs.open “Select * from tablename where uid=’Coolshow’”,conn,1,2 ’这里我们要添加数据,所以把参数改成了1,2 rs.addnew ’告诉rs, 我们要添加一行 rs(“字段1名”)=值1 ’给要添加的行的一个字段赋值 rs(“字段2名”)=值2 ’同上 rs(“字段3名”)=值3 ’同上 rs.update ’通知rs,我们要把这个行写入数据库 % >

  这段代码便可以把一个新的行写入数据库了。这里有我们以前没见过的两个方法rs.addnew和rs.update,其中rs.addnew是添加一个行时必要的,而rs.update则是写入、修改数据库时都需要用的。

  三、修改数据

  修改数据跟添加数据差不多,只是在T-SQL语句里,你必须只选取一个行。 < % ’……代码与前同,略 rs.open “Select * from tablename where uid=’Coolshow’”,conn,2,3 ’这里我们要修改数据,所以把参数改成了2,3 rs(“字段1名”)=值1 ’给要修改的行的一个字段赋一个新值 rs(“字段2名”)=值2 ’同上 rs(“字段3名”)=值3 ’同上 rs.update ’通知rs,我们要把修改好的这个行写入数据库 % >

  拿这段代码跟添加数据的代码比较,你会发现只有两个不同点,就是conn后边的参数变了以及没有了addnew,修改跟添加的区别仅在于此。利用ADO修改数据的技巧你也学会了。下边是删除数据,删除数据就更简单了。

  四、删除数据 < % ……’代码与前同,略 rs.open “Select * from tablename”,conn,2,3 rs.delete ’通知rs,我们要删除当前记录 % >

  这里我们新接触到的方法就是rs.delete了,顾名思义,就是删除当前记录嘛!讲到这里ADO的常用功能也就全部讲完。谨希望此文能开拓大家的思路,助喜欢ASP的朋友们轻松跨过ADO这个门槛。


2004-06-18 22:48
hell
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2004-6-3
收藏
得分:0 
支持辛苦发贴的honrry大侠!
你是一名合格的劳动者!!

2004-06-20 21:23
快速回复:[推荐]如何让 SQL Pass-Through 游标可更新
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024646 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved