0

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

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

4

3 回答 3

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

于 2013-08-12T17:03:43.793 回答
0

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

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

于 2013-08-12T20:59:20.727 回答
0

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

 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
于 2013-08-16T13:36:30.970 回答