C # VFP OLEDB-запрос «Команда содержит нераспознанную фразу / ключевое слово» - PullRequest
0 голосов
/ 27 мая 2018

У меня есть приложение на 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 голосов
/ 27 мая 2018

Кто бы ни проектировал эту систему, кажется, не имеет большого знания о 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();
}
...