命令参数

如何更正向oledb query发送参数?

MyCode是

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;

它不起作用)。我需要添加查询@target(表名)和@columnname(列名)。

修改为使用?

进行编码
cmd.CommandText = "UPDATE ? SET [?] = Replace([?],OleDbType.VarChar)).Value = column.ColumnName;
cmd.Parameters.Add(new OleDbParameter("@columnname",OleDbType.VarChar)).Value = column.ColumnName;

错误:

  

更新语句中的语法错误

串联样式出错

string query = "UPDATE " + tb_tablename.Text.Trim() + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "],'');";
  

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

完整代码:

DataTable dt = new DataTable();
using (OleDbdataAdapter adapter = new OleDbdataAdapter("SELECT * FROM " + tb_tablename.Text,conn))
{
    adapter.Fill(dt);
}

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 + "],'');";

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

有什么帮助:string query = "UPDATE " + tb_tablename.Text.Trim() + " SET " + column.ColumnName + " = Replace(" + column.ColumnName + ",\"\") WHERE " + column.ColumnName + " <> \"\";";

空白数据+保留的列名将全部破坏。 ColumnNames Date,Type,Note破坏了一切-将其从周期中排除。

a314068757 回答:命令参数

由于无法将SQL标识符(表名,列名等)用作参数,因此出现语法错误。只能参数化

您的查询将因此如下所示:

cmd.CommandText = "UPDATE "+tb_tablename.Text+" SET ["+...+"] = Replace(["+...+"],Chr(10),'');";

永远不要将用户提供的值连接到SQL中。因为在这种情况下,您被迫合并并入中的列名和列名,所以应绝对确保仅提供安全值。理想情况下,您应该采用为表名和列名提供的值,并且具有很多所有表名​​和列名(您可以查询数据库),并且仅当所提供的值在该列表中时才允许sql构建

这是一个非常不寻常的要求-此处几乎没有人试图参数化表名等。如果您试图编写某种迷你库来简化数据访问的寿命,我建议您使用已经存在的一个like Dapper

,

您在注释中指出,您正在尝试以最小的努力对数据库中的所有列运行替换。为此,您可以考虑以下事项:

  • 使用DbConnection对象的GetSchema方法获取数据库中表的列表
  • 循环遍历它,将表名的字符串sql连接到“ SELECT * FROM“ + tablename +” WHERE 1 = 0“中,并使用DataAdapter运行该sql以返回包含目标表的所有列的空数据表
  • 循环遍历datatable.Columns集合,从上面的选择返回,运行REPLACE sql,通过字符串concat细分表和列名(这是安全且不可入侵的,因为您检索了列表并且未包含由a提供的值用户
  • 如果您有非字符串列(日期,整数),请检查DataColumn的数据类型,并仅在字符串/ varchar或类似字符串时运行替换

有用的链接:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/getschema-and-schema-collections

https://sizious.com/2015/05/11/how-to-load-an-access-database-into-a-dataset-object-in-c/-半途而废-在此人的代码中添加where子句,以便不返回任何行(您只需要列)

,

您不能用参数替换表名和列名。

只能按如下方式应用参数:

UPDATE SomeTable SET SomeColumn = ?

最好允许用户从组合框/列表框中选择具有现成值的表和列的名称。像这样:

var table = tablesComboBox.SelectedItem;
var column = columnsComboBox.SelectedItem;

var query = "UPDATE " + table + " SET " + column +
            " = Replace(" + column + ",'''');";

请注意,您必须转义单引号字符。

本文链接:https://www.f2er.com/3083451.html

大家都在问