Следующий код вызывает исключение datatype mistmach in criteria expression. Откуда берется исключение? Сгенерированный запрос работает в Microsoft Access без проблем.

foreach (DataColumn column in dt.Columns)
{
    if (column.DataType == typeof(String))
    {
        if (column.ColumnName != "ID1" && column.ColumnName != "ID" && column.ColumnName != "Geometry" && column.ColumnName != "Geometry_SK")
        {
            string query = "UPDATE " + tb_tablename.Text.Trim() + " SET " + column.ColumnName + " = Replace([" + column.ColumnName + "], Chr(10), \"\");";

            using (OleDbCommand cmd = new OleDbCommand(query, conn))
            {
                cmd.ExecuteNonQuery();
            }
        }
    }
}

Например, сгенерированный код SQL UPDATE Necropolis SET NAME_MR = Replace([NAME_MR], Chr(10), ""); . После его создания выполните команду cmd.ExecuteNonQuery();

Версия параметров показывает Syntax error in query. Incomplete query clause..

using (OleDbCommand cmd = new OleDbCommand(query, conn))
                            {
                                cmd.CommandType = CommandType.Text;
                                cmd.CommandText = "UPDATE @target SET [@columnname] = Replace([@columnname], Chr(10), '');";

                                cmd.Parameters.Add(new OleDbParameter("@target", OleDbType.VarChar)).Value = tb_tablename.Text.Trim();
                                cmd.Parameters.Add(new OleDbParameter("@columnname", OleDbType.VarChar)).Value = column.ColumnName;

                                MessageBox.Show(cmd.CommandText);

                                cmd.ExecuteNonQuery();
                            }
-2
Дмитрий 15 Ноя 2019 в 13:49
И мне нравится, что есть идентификатор столбца и ID1 :)
 – 
Djuro
15 Ноя 2019 в 13:53
Добро пожаловать в Stack Overflow! Ознакомьтесь с инструкциями и как создать-воспроизводимый-пример, чтобы помочь вам задать хороший вопрос и, таким образом, получить хороший ответ.
 – 
Selim Yildiz
15 Ноя 2019 в 13:54
Каково точное значение query?
 – 
mjwills
15 Ноя 2019 в 14:35
 – 
mjwills
15 Ноя 2019 в 14:35
Проблема возникает из-за того, что вы ошибаетесь с типом, хранящимся в базе данных, таким как Varchar, и идентификаторами, которые должны быть статическими и не могут быть параметрами запроса. Посмотрите на stackoverflow.com/questions/2838490/table-name-as- переменная
 – 
Fab
18 Ноя 2019 в 12:14

1 ответ

Вы уверены, что query дает правильный оператор SQL? Я не уверен, но =Replace([xyz], Chr(10), \"\"); не выглядит для меня допустимым оператором SQL... Я думаю, вы должны использовать две отдельные строки для имени столбца:

string col_org = column.ColumnName;
string col_new = column.ColumnName.Replace(Chr(10), "\"");
string query = "UPDATE " + tb_tablename.Text.Trim() + " SET " + col_org + " = " + "+ col_new + ";";

Можете ли вы привести пример строки обновления?

0
Wolfgang Roth 15 Ноя 2019 в 13:57
UPDATE Necropolis SET NAME_MR = Replace([NAME_MR], Chr(10), "");
 – 
Дмитрий
15 Ноя 2019 в 14:00
Я бы сказал, что по крайней мере Replace([NAME_MR] должно быть Replace("[NAME_MR]", но тогда я не могу помочь дальше из-за отсутствия опыта SQL
 – 
Wolfgang Roth
15 Ноя 2019 в 14:20
Если я сделал это, он становится строкой и заменяет все данные - я пробую. Это имя столбца в таблице.
 – 
Дмитрий
15 Ноя 2019 в 14:24