C#VFP OLEDB查询抛出"命令包含无法识别的短语/关键字"

时间:2018-05-27 06:30:27

标签: c# visual-foxpro foxpro

我有一个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中,使用断点我看到一切正常 - 连接打开,参数值是预期的。我有另一个类似的程序,但只针对一个表。我不能为我的生活找出这个问题的错误。

1 个答案:

答案 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();
}