如何使用 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();
}
我想根据他们的发票号在一次查询中更新多重余额。但是下面的代码似乎 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();
}