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 的第三个参数中指定
------解决方案--------------------------------------------------------