C# 命令参数
如何将参数正确发送到oledb查询 麦可德是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
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。添加了有问题的完整代码。