VFP OLEDB 9函数在表有插入、更新时未实现错误;删除触发器
本文关键字:实现 错误 触发器 删除 更新 函数 OLEDB 插入 VFP | 更新日期: 2023-09-27 18:27:16
当我试图插入到FoxPro表中时,收到了"函数未实现"错误,该表在表设置GUI中具有与其相关的插入触发器。使用vs2012,我在数据集中创建了一个表适配器。我添加了如下所示的更新声明。下面还列出了我的C#项目中执行插入/更新的代码。如果我从FoxPro表中删除相关的触发器,我可以成功地插入/更新。使用触发器,插入和更新会引发"函数未实现"错误。Select的工作很好。
请帮助
utacc FoxPro表具有触发器设置,用于插入、更新和删除相关的SQL Server表。在立柱底部插入触发器。
VS 2012表适配器插入命令
INSERT INTO utacc
(fcmodid, fcuname, fccompid, fcacclvl, fcscope)
VALUES (?, ?, ?, ?, ?)
通过表适配器执行插入/更新的C#代码
using (var ta = new DataSet1TableAdapters.utaccTableAdapter())
{
foreach (var u in lUsers.GetList().Where(x => x.selected))
{
foreach (var screen in lScreen.GetList().Where(x => x.selected))
{
if (ta.GetData()
.Any(x => x.fccompid == _fccompid
&& x.fcmodid.Trim() == screen.fcmodid.Trim()
&& x.fcuname.Trim() == u.fcuname.Trim()))
ta.Update(perm, screen.fcmodid, _fccompid, u.fcuname);
else
ta.Insert(screen.fcmodid, u.fcuname, _fccompid, perm, "P");
}
}
}
这些触发器是对SQL服务器表的插入
这是FoxPro触发
PROCEDURE M2MTrig_UTACCInsert
LOCAL Cntr, ErrCode, ConStr, ConnName, ConnHandle, RV, ErrHndlr
SET DATA TO UTIL
ErrHndlr = ON("ERROR")
IF EMPTY(UTACC.FCUNAME)AND EMPTY(UTACC.FCMODID)AND EMPTY(UTACC.FCCOMPID ) THEN
RETURN .T.
ENDIF
ErrCode = 0
ON ERROR ErrCode = M2MTrig_ERR(ERROR(),MESSAGE(),ErrHndlr)
FOR Cntr = 1 TO 99
ConnName = "SystemDBConn" + ALLTRIM(STR(Cntr))
TRY
ConStr = DBGETPROP(ConnName,"CONNECTION","ConnectString")
CATCH TO oEx
ErrCode = oEx.ErrorNo
ENDTRY
IF ErrCode = 1562 THEN
EXIT
ENDIF
IF ErrCode <> 0 THEN
ON ERROR &ErrHndlr.
RETURN .F.
ENDIF
ConnHandle = SQLCONNECT(ConnName)
IF ErrCode <> 0 THEN
RETURN .F.
ENDIF
IF ConnHandle < 1 THEN
M2MTrig_ERR(-1, "Unable to connect using " + ConnName, ErrHndlr)
RETURN .F.
ENDIF
IF ErrCode <> 0 THEN
SQLDISCONNECT(ConnHandle)
RETURN .F.
ENDIF
Select UTACC
RV = M2MTrig_ExecSQL("EXEC UpdUTACC " + XC(FCACCLVL)+ ", "+ XC(FCCOMPID)+ ", "+ XC(FCMODID)+ ", "+ XC(FCSCOPE)+ ", "+ XC(FCUNAME), .T., ConnHandle, ErrHndlr)
IF ErrCode <> 0 THEN
SQLDISCONNECT(ConnHandle)
RETURN .F.
ENDIF
SQLDISCONNECT(ConnHandle)
IF ErrCode <> 0 THEN
RETURN .F.
ENDIF
IF RV < 0 THEN
RETURN .F.
ENDIF
IF RV < 1 THEN
M2MTrig_ERR(-1, "Could not update System database", ErrHndlr)
RETURN .F.
ENDIF
NEXT Cntr
ON ERROR &ErrHndlr.
RETURN .T.
OLEDB提供程序中的Fox引擎仅支持Fox命令和函数的子集。MSDN在这里列出了受支持的语言元素,在这里列出不受支持的元素。
远程SQL函数SQLCONNECT()等都在禁止项目列表中。错误处理程序也可能使用禁用的内容,如MessageBox()、WAIT WINDOW、SET MESSAGE或?。
除此之外,代码似乎还有很多问题。首先,它忽略了所有安全和干净编码的准则,比如用m或m->限定对内存变量的右值访问,以避免新表中的字段名出现令人讨厌的意外,或者关于在触发代码中做什么(不)的规则。
最好完全废弃代码,找到一个更简单、更干净的解决方案。
附言:使用现有基础设施的一种方法是不是通过OLEDB而是通过COM来控制Fox端,即构建一个小的COM服务器exe。这可以像通过DoCmd()向Fox发送命令一样简单,也可以像一个完整的COM对象一样复杂。在VFP9中,甚至可以从COM方法返回数组和行集,因此接口可以随心所欲地丰富。
附言:如果数据位于SQL Server数据库中,那么你为什么要和Fox说话?