FoxPro立即if(IIF)-函数名称丢失)错误



好吧,根据错误消息,你会认为这很简单(可能是…)

我在FoxPro 9.2数据库中使用IIF(immediate if)来评估表达式,然后根据表达式的评估方式执行两个操作之一(基本上,如果存在记录,则更新它;如果不存在,则插入它)。

IIF(
    ((SELECT COUNT(*) FROM tblName 
    WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004') > 0), 
    (UPDATE tblName SET tblName.Desc = 'Me' 
    WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004'), 
    (INSERT INTO tblName(Fldname, rCode, Desc) 
    VALUES ('FLDMy','000004','Me'))
    )

这总是返回错误:"函数名称丢失)。"注意,所有的括号都匹配,所以它不会在任何地方丢失")"。单独的UPDATE和INSERT在单独运行时工作良好,所以我怀疑问题出在表达式(IIF中的第一条语句)上。

我正在从C#服务执行SQL,所以我希望能够在对FoxPro数据库的一次调用中进行检查和操作。

VFP IIF()可以返回"字符、数字、货币、日期或日期时间"。但它不能执行语句。我想尝试的是将IIF()封装在VFP EVALUATE()函数中。我还将使第二个和第三个参数返回UPDATE和INSERT语句的字符串。例如:

EVALUATE( IIF(.t., "UPDATE tblName SET tblname.desc = 'ME' WHERE fldname = 'FLDMy'", "INSERT INTO tblName(fldname) VALUES( 'FLDMy' ) " )  )

为了简洁起见,上面的例子是从你的陈述中缩写出来的。在这种情况下,上面的EVALUATE()将执行UPDATE语句。试试看。然后用你的完整陈述代替。

您混淆了VFP"SELECT";是一个(内置)SQL命令,一个用于更改当前工作区域的内置命令,也是一个返回当前所选工作区域编号的函数。

此外,IIF()是一个以表达式(计算为单个值的东西)为参数的函数。SQL SELECT和UPDATE命令并不能做到这一点,即使将它们封装在括号中也是如此。它实际上是基于第一个参数的值返回两个值中的一个,而不是用于控制流逻辑。我建议以IF的形式重写代码。。其他。。ENDIF块。

我尝试复制您在命令窗口中所做的操作,但收到了相同的错误。

 x = ((SELECT COUNT(*) FROM tblName 
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004') > 0)

返回错误"Function name is missing)"。执行查询,将其放入光标中,然后在_Tally>1 上执行If语句

SELECT COUNT(*) FROM tblName 
WHERE tblName.Fldname = 'FLDMy' AND tblName.rCode = '000004' into cursor cTrash
If _Tally > 0
    UPDATE tblName SET tblName.Desc = 'Me' WHERE tblName.Fldname = 'FLDMy' 
      AND tblName.rCode = '000004'
Else
    INSERT INTO tblName(Fldname, rCode, Desc) 
      VALUES ('FLDMy','000004','Me')
EndIf

相关内容

  • 没有找到相关文章

最新更新