如何使用 FoxPro 数据库在一个查询中更新同一列的多行?

How to update multiple rows of same column in one query using FoxPro database?

我想根据他们的发票号在一次查询中更新多重余额。但是下面的代码似乎 FoxPro 不接受它。

PS:我在我的经典 ASP 网站上只使用 Visual FoxPro 6 作为数据库。

 UPDATE accounts_receivables SET balance = 
      CASE invoice_no 
       WHEN 3 THEN 6
       WHEN 4 THEN 8
       ELSE balance
      END
      WHERE invoice_no IN (3,4)

您必须改用 ICASE() 函数。像这样:

 UPDATE accounts_receivables SET balance = 
      ICASE (
       invoice_no = 3, 6,
       invoice_no = 4, 8,
       "balance" 
            )
      WHERE invoice_no IN (3,4)

这适用于 VFP6:

UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, iif(invoice_no=4, 8, balance)) WHERE invoice_no IN (3,4)

这在逻辑上也与写作相同:

UPDATE accounts_receivables SET balance = iif(invoice_no=3, 6, 8)) WHERE invoice_no IN (3,4)

只要您只过滤 3、4。

但是,您也可以通过 VFPOLEDB(甚至在 VFP6 中)执行此操作,然后您也可以编写一个支持 VFP9 的查询(因为您说“ASP”可能您已经在访问通过 VFP 驱动程序而不是直接访问数据,您可以简单地使用 VFPOLEDB 并利用支持的 VFP9 SQL)。

VFP 中的示例(ASP 或 VBA 中几乎相同的代码):

Local oCon, oCmd
oCon = Createobject("ADODB.Connection")
oCmd = Createobject("ADODB.Command")

oCmd.CommandType = 1
oCmd.CommandText = "UPDATE accounts_receivables"+;
    " SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)"+;
    " WHERE invoice_no IN (3,4)"

oCon.ConnectionString = "Provider=VFPOLEDB;Data Source=c:\MyDataFolder"
oCon.Open()

oCmd.ActiveConnection = oCon
oCmd.Execute

然后说 ASP,如果此时你的意思是 ASP.Net 而不是旧的经典 ASP,那么你甚至可以像这样更简单:

string sql = @"UPDATE accounts_receivables
    SET balance = icase(invoice_no=3, 6, invoice_no=4, 8, balance)
    WHERE invoice_no IN (3,4)"; 
using(OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\MyDataFolder"))
using(OleDbCommand cmd = new OleDbCommand(sql,con))
{
   con.Open();
   cmd.ExecuteNonQuery();
   con.Close();
}