c# - 使用 oledbcommand 在多个列中搜索相同值的最佳方法是什么
问题描述
因此 OLE DB .NET Provider 不支持命名参数,是否有更好或更快的方法来搜索多个列?就像只使用单个参数?
cmd = new OleDbCommand("SELECT * FROM Table1 WHERE Column1 LIKE ? OR Column2 LIKE ? OR Column3 LIKE ? OR Column4 LIKE ? OR Column5 LIKE ? OR Column6 LIKE ? OR Column7 LIKE ? OR Column8 LIKE ? OR Column9 LIKE ? OR Column10 LIKE ? ", con);
cmd.Parameters.AddWithValue("@Column1", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column2", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column3", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column4", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column5", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column6", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column7", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column8", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column9", "%" + txtSearch.Text + "%");
cmd.Parameters.AddWithValue("@Column10", "%" + txtSearch.Text + "%");
如果我只使用单个参数,则找不到第二个参数的值
解决方案
仅发送一次参数的一种方法是使用cross apply
:
// proper indentation makes for a more readable code
var sql = @"SELECT *
FROM Table1
CROSS APPLY
(
SELECT '%'+ ? +'%' As searchParam
) As s
WHERE Column1 LIKE searchParam
OR Column2 LIKE searchParam
OR Column3 LIKE searchParam
OR Column4 LIKE searchParam
OR Column5 LIKE searchParam
OR Column6 LIKE searchParam
OR Column7 LIKE searchParam
OR Column8 LIKE searchParam
OR Column9 LIKE searchParam
OR Column10 LIKE searchParam";
// OleDbCommand implements the IDisposable interface...
using (var cmd = new OleDbCommand(sql, con))
{
// use Add instead of AddWithValue
cmd.Parameters.Add("@searchParam", OleDbType.VarWChar).Value = txtSearch.Text;
con.Open();
// Execute command here
}
阅读我们可以停止使用 AddWithValue() 了吗?解释为什么这AddWithValue
是一个坏主意。
请注意,这仍在使用非SARGable谓词搜索多个列,因此 SQL Server 无法对此处的任何条件使用索引搜索。
推荐阅读
- php - php发送的电子邮件标题中的特殊字符
- java - 配置 log4j2 为不同的包有不同的日志级别
- javascript - 我怎样才能在这里触发 popstate 事件?
- swift - 有人可以帮我阻止 arc4random 生成的数字再次出现吗?
- python - 您可以使用 Twitter API 查询的每个帐户的推文是否有时间限制?
- html - 如何使用引导 css 制作导航项?
- grafana - Grafana 中按天分组的 InfluxDB 数据移动了一天
- google-sheets - 根据输入在 Google 表格中创建动态列表
- android - 如何使用 dart/flutter 中的共享首选项保存和获取列表列表
- windows - DNS 配置添加新主机(A 或 AAAA)和新别名(CNAME)