如何更正向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([?], 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;
错误:
更新语句中的语法错误
串联样式出错
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_tablename.Text.Trim() + " SET " + column.ColumnName + " = Replace(" + column.ColumnName + ", Chr(10), \"\") WHERE " + column.ColumnName + " <> \"\";";
空白数据+保留的列名将全部破坏。 ColumnNames Date,Type,Note破坏了一切-将其从周期中排除。
答案 0 :(得分:1)
由于无法将SQL标识符(表名,列名等)用作参数,因此出现语法错误。只能参数化
您的查询将因此如下所示:
cmd.CommandText = "UPDATE "+tb_tablename.Text+" SET ["+...+"] = Replace(["+...+"], Chr(10), '');";
永远不要将用户提供的值连接到SQL中。因为在这种情况下,您被迫合并并入中的列名和列名,所以应绝对确保仅提供安全值。理想情况下,您应该采用为表名和列名提供的值,并且具有很多所有表名和列名(您可以查询数据库),并且仅当所提供的值在该列表中时才允许sql构建< / p>
这是一个非常不寻常的要求-此处几乎没有人试图参数化表名等。如果您试图编写某种迷你库来简化数据访问的寿命,我建议您使用已经存在的一个like Dapper
答案 1 :(得分:0)
您在注释中指出,您正在尝试以最小的努力对数据库中的所有列运行替换。为此,您可以考虑以下事项:
有用的链接:
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子句,以便不返回任何行(您只需要列)
答案 2 :(得分:0)
您不能用参数替换表名和列名。
只能按如下方式应用参数:
UPDATE SomeTable SET SomeColumn = ?
最好允许用户从组合框/列表框中选择具有现成值的表和列的名称。像这样:
var table = tablesComboBox.SelectedItem;
var column = columnsComboBox.SelectedItem;
var query = "UPDATE " + table + " SET " + column +
" = Replace(" + column + ", Chr(10), '''');";
请注意,您必须转义单引号字符。