条件表达式中的 C# 数据类型不匹配

Posted

技术标签:

【中文标题】条件表达式中的 C# 数据类型不匹配【英文标题】:C# data type mismatch in criteria expression 【发布时间】:2019-11-15 10:49:49 【问题描述】:

以下代码引发异常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();
                            

【问题讨论】:

@tymtam 我喜欢有列 ID 和 ID1 :) 欢迎来到 Stack Overflow!请查看how-to-ask 和how-to-create-reproducible-example 以帮助您提出一个好问题,从而得到一个好的答案 query确切值是多少? ***.com/questions/601300/what-is-sql-injection 问题出在您错误地存储在数据库中的类型(如 Varchar)和应该是静态且不能作为查询参数的标识符。看***.com/questions/2838490/table-name-as-variable 【参考方案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 + ";";

你能给我们一个更新字符串的例子吗?

【讨论】:

更新墓地 SET NAME_MR = Replace([NAME_MR], Chr(10), ""); 我会说,至少 Replace([NAME_MR] 应该是 Replace("[NAME_MR]" 但由于缺乏 SQL 经验,我无法进一步提供帮助 如果我这样做了,它会变成字符串并替换所有数据 - 我试试看。这是表中的列名。

以上是关于条件表达式中的 C# 数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C# Access OleDb 条件表达式中的数据类型不匹配

OleDbException:条件表达式中的数据类型不匹配

错误:条件表达式中的数据类型不匹配

尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误

选择查询 C# 查询中条件表达式中的数据类型不匹配错误

试图跟踪条件表达式中的数据类型不匹配