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

时间:2013-08-12 16:05:00

标签: foxpro iif

好的,根据错误信息,您会认为这很简单(可能是......)。

我在FoxPro 9.2数据库中使用IIF(立即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数据库中进行检查和操作。

3 个答案:

答案 0 :(得分:3)

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语句。试一试。然后用你的完整陈述代替。

答案 1 :(得分:0)

你让VFP感到困惑。 “SELECT”是一个(内置)SQL命令,一个用于更改当前工作区的内置命令,它也是一个返回当前所选工作区编号的函数。

此外,IIF()是一个将表达式(评估为单个值)作为参数的函数。即使将它们包装在括号中,SQL SELECT和UPDATE命令也不会这样做。它实际上是根据第一个参数的值返回两个值中的一个 - 它实际上不适用于控制流逻辑。我建议以IF .. THEN .. ENDIF块的形式重写代码。

答案 2 :(得分:0)

我尝试在命令窗口中复制您正在执行的操作并收到相同的错误。

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

返回错误“缺少函数名称。”执行您的查询,将其抛入游标并在_Tally>上执行If语句1

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