当前位置: 代码迷 >> VFP >> VFP 内调用 ADO 出错 VFP 通过 CA 访问 native 表有有关问题
  详细解决方案

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

热度:5781   发布时间:2013-02-26 00:00:00.0
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 的第三个参数中指定

------解决方案--------------------------------------------------------
  相关解决方案