0

尝试在表设置 GUI 中插入具有与其相关的插入触发器的 FoxPro 表中时,我收到“函数未实现”错误。使用 vs2012,我在数据集中创建了一个表适配器。我添加了如下所示的更新语句。下面还列出了我的 C# 项目中执行插入/更新的代码。如果我从 FoxPro 表中删除关联的触发器,我可以获得成功的插入/更新。使用触发器、插入和更新会引发“功能未实现”错误。选择的工作正常。

请帮忙

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. 
4

1 回答 1

0

OLEDB 提供程序中的 Fox 引擎仅支持 Fox 命令和函数的子集。MSDN 在此处列出了受支持的语言元素,在此处列出了不受支持的语言元素。

远程 SQL 函数 SQLCONNECT() 等 - 在禁止项目列表中。错误处理程序也可能使用禁止的东西,如 MessageBox()、WAIT WINDOW、SET MESSAGE 或?。

除此之外,代码似乎还有更多问题。首先是它忽略了安全和干净编码的所有准则,例如使用 m 限定对内存变量的右值访问。或 m-> 以避免新表中的字段名称令人讨厌的意外,或有关在触发器代码中(不)做什么的规则。

最好完全废弃代码并找到更简单、更清洁的解决方案。

PS:使用现有基础架构的一种方法是控制 Fox 端,而不是通过 OLEDB,而是通过 COM,即构建一个小的 COM 服务器 exe。这可以像通过 DoCmd() 向 Fox 发送命令一样简单,也可以像完整的 COM 对象一样复杂。在 VFP9 中,甚至可以从 COM 方法返回数组和行集,因此接口可以随心所欲。

PPS:如果数据存储在 SQL Server 数据库中,那你为什么要与 Fox 交谈?

于 2014-10-21T18:11:17.390 回答