首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

VFP 内调用 ADO 出错 VFP 通过 CA 访问 native 表有有关问题

2012-09-15 
VFP 内调用 ADO 出错VFP 通过 CA 访问 native 表有问题PROCEDURE VFPADOLOCAL scon as ADODB.ConnectionLO

VFP 内调用 ADO 出错 VFP 通过 CA 访问 native 表有问题
PROCEDURE VFPADO
  LOCAL scon as ADODB.Connection
  LOCAL srs as ADODB.Recordset 
  LOCAL scmd as ADODB.Command
   
  scon=CREATEOBJECT("ADODB.Connection")
  scon.ConnectionString ="Driver=SQL SERVER;Server=127.0.0.1;UID=sa;PWD=000000;Data Base=crgdjy"
  scon.open 
   
  scmd = createobject('ADODB.Command')
  scmd.ActiveConnection =scon
  scmd.CommandText ="select * from Fullstudent"
  scmd.CommandType = 1
  scmd.Execute && 这里出错
   

   
  srs=CREATEOBJECT("ADODB.RecordSet")
  srs.ActiveConnection =scon
  srs.Source ="select * from Fullstudent"
  srs.CursorType =1
  srs.cursorlocation=2
  srs.locktype=1
  srs.Open && 这里出错
  srs.AddNew  
  srs.Fields.Item("IP")=P_mac
  srs.Update
  srs.Close
   
   
ENDPROC

为什么不行?


以下是一个访问本地方的CA 
showlocattable ("pp","pp") && 本地一个pp.dbf 程序会出错 说别名已经使用
我只好换为
showlocattable ("pp","pp9")

函数结束,pp9别名自动关(是不是函数结束 CA类自动释放的原因),便是 PP 不关,我只好人工关,为什么
PROCEDURE showlocaltable
  PARAMETERS sTblName,sAlias
local loCursor as CursorAdapter, laErrors[1]
loCurSor =CREATEOBJECT("CursorAdapter")
with loCursor
.Alias = sAlias
.DataSourceType = 'Native'
.SelectCmd = "Select * FROM &sTblName"
.KeyFieldList = 'ID'
.Tables = sTblName
.UpdatableFieldList = 'nindex,ID' &&如果这是地SQL 表,哪么 UPDatableFieldList 与UpdateNamelist 是什么关系,为什么要设置 UpdateNamelist
.UpdateNamelist = 'nindex &sTblName..nindex,ID &sTblname..ID'

if .CursorFill()
browse
tableupdate(1)
else
aerror(laErrors)
messagebox(laErrors[2])
endif 
endwith
?ALIAS()
cmdstr="USE IN &sAlias"
&cmdstr
cmdstr="USE IN &sTblname"
?cmdstr
&cmdstr
ENDPROC

[解决办法]
1. 我不用 ADO,飘过

2. 函数结束后,你用 local 定义的 loCursor 超出作用域而被释放,所以它托管的 CURSOR sAlias 也被自动关闭。因为 sAlias 来源于 sTblName,而 sTblName 可能在你创建 ca 前已经打开,也可能几个 ca 的来源都来自于它,所以 sTblName 不会也不能自动关闭。
另外,sAlias 和 sTblName 应该有不同的名字。对于本地表,如果这两个名字相同,不会发生生成 sAlias 的动作,你可以用 CursorGetProp('Buffering') 看到这时是没有缓冲特性的,换句话说,只执行了 use 数据源表 的操作,后续动作不会执行。

3. UpdatableFieldList:指哪些字段可更新到后台表,它指的是前台表字段
  UpdateNamelist: 指要更新的 前台表字段 与 后台表字段 之间的对应关系。
例如:
如果 SelectCmd 是
select
 t1.id,
 t1.name,
 t2.id as id2,
 t2.name as name2
from t1
inner join t2 on t2.fid = t1.id
那么前台表 sAlias 中将存在 id, id2, name, name2 四个字段,则:
Tables = 't1, t2'
KeyFieldList = 'id, id2'
UpdatableFieldList = 'id, id2, name, name2'
UpdateNamelist = 'id t1.id, id2 t2.id, name t1.name, name2 t2.name'
也就是
name 字段内容更新到后台表 t1 的 name 字段
name2 字段内容更新到后台表 t2 的 name 字段

4. ca 有自己的可视化设计器 builder,在可视化设计时,不会有这些麻烦事,通常你只需要关注 SelectCmd 编辑框中内容

[解决办法]
alias 与 tables 属性无关系, alias 是缓冲后的临时表,名字可随意
tables 指要更新哪些源表,updateNamelist 表中指定的源表表名,这里通常都要有

[解决办法]
1. 取所有表名:
select name from master.dbo.sysdatabases

2. 是,如果要更新的 cursor 是当前工作区则不需指定, 否则在 tableupdate 的第三个参数中指定

[解决办法]


看错了,是取表名而不是取一个连接的所有数据库名
取一个数据库的所有表名参见 sqltables 函数的帮助

[解决办法]
还有再追问一下: 连接上sqlserver 之后,如何获取所有表名呢
---

select * from sysobjects where type='U'
查出所有表名

热点排行