【问题标题】:FoxPro immediate if (IIF) - Function name is missing ) errorFoxPro 立即 if (IIF) - 缺少函数名) 错误
【发布时间】:2013-08-12 16:05:00
【问题描述】:

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

我在 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 数据库的一次调用中执行检查和操作。

【问题讨论】:

    标签: foxpro iif


    【解决方案1】:

    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 语句。试试这个。然后替换你的完整陈述。

    【讨论】:

    • 谢谢。我使用 EVALUATE 尝试了各种事情(包装整个 IIF 或仅包装 IIF 的表达式部分),但它一直给我一个语法错误。我明白您所说的 IIF 无法执行语句,但似乎 EVALUATE 也无法执行 SQL 字符串 - 即使尝试 EVALUATE("SELECT * FROM tblname") 也会引发语法错误。
    • EVALUATE() 只能计算表达式,不能计算语句。对于您要执行的操作,您可能需要创建一个代码块并使用 EXECSCRIPT()。
    【解决方案2】:

    您混淆了 VFP。 “SELECT”是一个(内置)SQL命令,是一个改变当前工作区的内置命令,也是一个返回当前选中的工作区号的函数。

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

    【讨论】:

      【解决方案3】:

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

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

      返回错误“缺少函数名)。”执行您的查询,将其放入游标中并在 _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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        相关资源
        最近更新 更多