注册 登录
编程论坛 VFP论坛

请问数据ca类做好后如何调用

fanjinyu9108 发布于 2021-07-17 16:36, 2544 次点击
如题,我把每个数据表都做成数据环境+ca,可是经常出问题,现在我想直接做成ca类,可是不知如何调用


[此贴子已经被作者于2021-7-17 16:39编辑过]

21 回复
#2
fanjinyu91082021-07-17 16:48
我把一个数据环境类放多个ca类表,打开一个表单,再打开另外一个表单,另一个表单居然找不到表了,是不是一个表单不能有多少数据环境啊
#3
fanjinyu91082021-07-17 16:55
比如,我建好一个CA类,用如下代码:
PUBLIC ca_tt
lei=right(justpath(sys(16)),RAT("\",sys(16))-AT("\",sys(16))+2)+"\mylei.vcx"
SET CLASSLIB TO &lei ADDITIVE     
thisform.AddObject("ca_tt", "ca_1")
表单显示如下错误:对于此容器,对象类无效
#4
xuminxz2021-07-17 17:11
错误信息说的很清楚了啊。CA不能作为表单的对象。
CA我几乎没有在实际的程序中用过CA对象是VFP最后的挣扎(8.0)时引入的,按帮助文件的说法,我理解是为了适用多数据源而用的,采集同一类数据时,不同人用不同的数据源提供,甚至是不同的格式。例如,收集人员数据,上报的内容是一样的,但大家不是填写到同一个数据库中,甚至有的用Excel,有的用DBF。不知道我理解的对不对?
它与表和视图不完全相同,从cursoradapter字面上理解,它和SQL Server的表似乎更接近。


[此贴子已经被作者于2021-7-17 17:13编辑过]

#5
fanjinyu91082021-07-17 17:16
PUBLIC ca_tt
lei=right(justpath(sys(16)),RAT("\",sys(16))-AT("\",sys(16))+2)+"\mylei.vcx"
SET CLASSLIB TO &lei ADDITIVE     
thisform.dataenvironment.AddObject("ca_tt", "ca_1")

这样调用,好像可以打开表了


[此贴子已经被作者于2021-7-17 17:19编辑过]

#6
fanjinyu91082021-07-17 17:28
必须放在数据环境的BOFOREOPENTABLES事件里面,但是还是有个问题,就是CA类创建的表是共享的吗、如果在一个表单的私有环境下打开了,在另外一个表单私有环境有可能打不开吗?
#7
fanjinyu91082021-07-17 20:22
ca调用尽出怪问题,先打开表单一,再打开表单二,正常。先打开表单二,再打开表单一,表单一的数据调用失败,用远程视图从未出问题

[此贴子已经被作者于2021-7-17 20:24编辑过]

#8
fanjinyu91082021-07-17 23:07
ca有个好处是可以用requery()来刷新数据,如果用sPT的话,比如显示今天的数据,如果要改成显示昨天的数据,就要关闭表再打开,但是用CA 可以用requery()数据就更新了
#9
fanjinyu91082021-07-18 06:23
急死人了,CA快把我弄疯了,我创建CA打开一个表单,同时在另外一个表单创建CA打开,就显示找不到表了
程序代码:
local 数据环境3
thisform.AddObject("数据环境3", "dataenvironment")
lei=right(justpath(sys(16)),RAT("\",sys(16))-AT("\",sys(16))+2)+"\lei_sj.vcx"
SET CLASSLIB TO &lei ADDITIVE
WITH thisform.数据环境3
  .AddObject("ca_fy_mxtab3", "ca_fy_mxtab2")
  .AddObject("ca_fy_history1", "ca_fy_history")
ENDWITH
thisform.数据环境3.opentables


[此贴子已经被作者于2021-7-18 06:44编辑过]

#10
fanjinyu91082021-07-18 06:28
同一个数据源只能创建一次CA类,这是怎么回事啊,难道只能回到远程视图了吗,不甘心啊
#11
fanjinyu91082021-07-18 08:27
是否没有共享打开,连接本身是共享的,可是如何共享打开表呢
#12
xuminxz2021-07-18 14:09
回复 8楼 fanjinyu9108
远程视图也可用requery()啊
#13
fanjinyu91082021-07-18 14:13
当然可以,但是需要数据库,安全性差一点,而且连接不能动态的
#14
xuminxz2021-07-18 14:20
你一直在说动态的,指的是什么?是数据源的结构在运行时会变化吗?
#15
fanjinyu91082021-07-18 15:32
我说的动态,比如就说远程视图的连接吧,必须事先创建好,但是动态的连接,我可以把服务器的IP地址放在本地的自由表里面,IP修改了,只要修改自由表连接地址,连接也跟着变。远程视图的连接可以在软件运行中修改吗?

[此贴子已经被作者于2021-7-18 15:35编辑过]

#16
xuminxz2021-07-18 15:40
回复 15楼 fanjinyu9108
这个当然可以了。而且为了安全起见,在关闭程序时,可以将连接内容清空。启动程序或调用视图时再给连接字符串赋值。指向同一服务器的连接可以是一个,也可以是多个。如果你不想将视图保存在VFP的数据库中,也可以关闭数据库时,删除视图。运行时用命令再建立。早期我都是这么作的,但这有点麻烦,后来都时用rar将数据库压缩、删除。用时解压。

[此贴子已经被作者于2021-7-18 15:44编辑过]

#17
fanjinyu91082021-07-18 16:54
可以在执行程序的时候赋值吗?代码怎么写?xuminxz师傅,能告诉我简单的代码吗?

[此贴子已经被作者于2021-7-18 18:05编辑过]

#18
厨师王德榜2021-07-19 12:48
CA可以由数据环境建立,也可以由代码建立,我更倾向于用代码建立,
我觉得代码建立的话,什么时候打开,什么时候关闭,什么时候释放,更容易掌握,
所以,你的情况是CA由数据环境产生,我没怎么用过,无法帮到你.
但是我想,如果由代码建立,并且设置为公共变量,或许你的问题可以解决.
#19
fanjinyu91082021-07-20 06:48
用代码建立太麻烦了,我现在决定改回远程视图,以减少工作量,但是我想在启动程序或调用视图时再给连远程视图接字符串赋值,请问怎么弄?

[此贴子已经被作者于2021-7-20 07:00编辑过]

#20
xuminxz2021-07-20 10:47
用 DBSETPROP()
 DBSETPROP('link','CONNECTION','CONNECTSTRING',dbq)
link--连接名
'CONNECTION','CONNECTSTRING' 不变表示设置字符串连接
dbq-连接字符串。例如,下面是连接Sql Server服务器:
dbq='DRIVER=SQL Server;SERVER='+IP+';UID='+_uid+';PWD='+_pwd+';Network=DBMSSOCN;Address='+IP+',1433'
ip  服务器地址,1433端口(可根据实际情况改变)
uid  用户名
pwd 口令
最简单的办法,手工建立连接,将其中字符串复制出来。
如果,为了保密可将字符串加密,用时解密。可以放在表中,也可以写入注册表中。
关闭数据库时,将dbq设置为空或无效连接用DBSETPROP写入。

[此贴子已经被作者于2021-7-20 11:05编辑过]

#21
厨师王德榜2021-07-20 12:45
回复 19楼 fanjinyu9108
代码建立CA类也不麻烦,思路决定出路.
可以写一个通用的类,自动抓取表结构,生成CA.
受一个前辈启发,目前正在写一个这样的通用类.
目前已经可以支持MSSql ,MySQL,Access 三种常用数据库,
无论基于ODBC 还是ADO连接,均可由类方法,自动生成指定表的CA类.
目前正在测试.
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


#22
fanjinyu91082021-07-20 21:46
我是用图表自动生成的ca类,就象生成远程视图那样,没用手工代码,但老是出问题,搞怕了,先放弃下。感谢各位师傳的解答,我先结帖。

[此贴子已经被作者于2021-7-20 21:47编辑过]

1