我有一个C#应用程序,用于根据另一个表中的值更新表中的一个字段。使用以下内容:
listComm.CommandText = "update [c-disc] inner join [c-info] " +
"on [c-info].keys = [c-disc].cd_key set [c-disc].cd_distric = ? " +
"where [c-disc].cd_tax = ? and [c-info].ci_region = ?";
并在它下面的foreach循环中:
string region = line.Substring(0, 4).PadRight(14);
string taxable = "Y";
string district = line.Substring(5, 4).PadLeft(4);
listComm.Parameters.Add(new OleDbParameter("?", district));
listComm.Parameters.Add(new OleDbParameter("?", taxable));
listComm.Parameters.Add(new OleDbParameter("?", region));
try {
listComm.ExecuteNonQuery();
listComm.Parameters.Clear();
} catch (Exception x) {
setStatusText("fatal error: " + x.Message.ToString();
}
我得到"命令包含无法识别的词组/关键字"。当我插入适当的值代替'?'时,在MS Access中使用相同的查询可以正常工作。占位符。在Visual Studio中,使用断点我看到一切正常 - 连接打开,参数值是预期的。我有另一个类似的程序,但只针对一个表。我不能为我的生活找出这个问题的错误。
答案 0 :(得分:0)
无论是谁设计了这个系统,听起来都不太了解VFP。 VFP不完全兼容ANSI SQL,不仅具有一些命名规则。您的设计师将表中的破折号命名为?在文档中,我记得有警告。无论如何你仍然可以使用那个希望,cd_key和cd_tax字段只在' c-disc'表(否则你需要一些解决方法)。
using (OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=c:\MyDataFolder"))
{
var sql = @"update [c-disc]
set cd_distric = ?
from [c-info] ci
WHERE ci.keys = cd_key AND
cd_tax = ? and ci.ci_region = ?";
var listComm = new OleDbCommand(sql, con);
listComm.Parameters.Add("dst", OleDbType.Char);
listComm.Parameters.Add("tx", OleDbType.Char);
listComm.Parameters.Add("reg", OleDbType.Char);
string taxable = "Y";
listComm.Parameters["tx"].Value = taxable; // constant?
con.Open();
// Loop here
// {
// These paddings do not smell good
string region = line.Substring(0, 4).PadRight(14);
string district = line.Substring(5, 4).PadLeft(4);
listComm.Parameters["dst"].Value = district;
listComm.Parameters["reg"].Value = region;
try
{
listComm.ExecuteNonQuery();
}
catch (Exception x)
{
setStatusText("fatal error: " + x.Message.ToString());
}
// loop ends here
// }
con.Close();
}