Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命令参数_C#_Oledb - Fatal编程技术网

C# 命令参数

C# 命令参数,c#,oledb,C#,Oledb,如何将参数正确发送到oledb查询 麦可德是 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 OleDbPa

如何将参数正确发送到oledb查询

麦可德是

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([?], 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;
cmd.Parameters.Add(new OleDbParameter("@columnname", OleDbType.VarChar)).Value = column.ColumnName;
出现错误:

update语句中的语法错误

连接样式出现错误

string query = "UPDATE " + tb_tablename.Text.Trim() + " SET [" + column.ColumnName + "] = Replace([" + column.ColumnName + "], Chr(10), '');";
条件表达式中的数据类型不匹配

完整代码:

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

        using (OleDbCommand cmd = new OleDbCommand(query, conn))
        {
            cmd.ExecuteNonQuery();
        }
    }
}
}
有什么帮助:
string query=“UPDATE”+tb\u tablename.Text.Trim()+“SET”+column.ColumnName+”=替换(“+column.ColumnName+”,Chr(10),\”),其中“+column.ColumnName+”\”;”


空白数据+保留列名将全部断开。ColumnNames Date、Type、Note brokes all-将其从循环中排除。

由于无法将SQL标识符(表名、列名等)作为参数,因此出现语法错误。只有值可以参数化

因此,您的查询必须如下所示:

cmd.CommandText = "UPDATE "+tb_tablename.Text+" SET ["+...+"] = Replace(["+...+"], Chr(10), '');";
切勿将用户提供的值连接到SQL中。因为在这个实例中,您被迫在中使用concat和列名,所以您应该绝对确保只提供安全值。理想情况下,您应该使用为表名和列名提供的值,并拥有大量的所有表名和列名(您可以为此查询数据库),并且仅当提供的值在该列表中时才允许sql生成


这是一个非常不寻常的要求-这里几乎没有人寻求参数化表名等。如果您试图编写某种迷你库,以使您的数据访问更轻松,我建议您使用一个已经存在的数据库

您在评论中指出,您正试图以最小的努力在数据库中的所有列上运行替换。为此,您可以考虑以下内容:

  • 使用DbConnection对象的GetSchema方法获取数据库中的表列表
  • 循环,将表名的字符串sql连接到“SELECT*FROM”+tablename+“WHERE 1=0”中,并使用DataAdapter运行此sql,以返回包含目标表所有列的空datatable
  • 在datatable.Columns集合上循环,从上面的select返回,运行替换sql,通过字符串concat将表和列名子绑定到中(这是安全的,不可破解的,因为您检索了列表,而不是用户提供的concatting值)
  • 如果您有非字符串列(日期、整数),则检查DataColumn的数据类型,仅当它是string/varchar或类似类型时才运行替换
有用链接:


-走了一半-在这家伙的代码中添加where子句,这样就不会返回任何行(您只需要列)

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

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

UPDATE SomeTable SET SomeColumn = ?
最好允许用户从具有现成值的组合框/列表框中选择表和列的名称。如下所示:

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

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

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

OLE DB.NET提供程序不支持命名参数。问号(?)我认为在OLE中,你可以写“NealDead”参数,但是它们并不像命名参数那样起作用,它们仍然是位置的,你必须为每个参数声明一个值。使用dataadapter将所有值发送回db@CaiusJard我正在ms access中使用替换函数。您建议在c#中使用替换函数,然后进行更新?access不使用“for strings?替换为
”"
不是
?我如何动态更改它?我需要对所有列执行Replace..噢,这很难,因为Access没有类似SQL Server的信息模式来列出数据库的所有列和表。我将做另一个回答实际上,只是一个快速查询-这是MS Access吗?我假设是,但后来认为我是可能是其他原因…如果我尝试连接,它会显示
System.Data.OleDb.OleDbException:“条件表达式中的数据类型不匹配。”
,因为您只能在字符串类型列上运行REPLACE。我的算法可能是相同的。但它将执行exeption。添加了有问题的完整代码。