使用 oledbcommand 在多个列中搜索相同值的最佳方法是什么
What is the best way to search multiple columns for same value using 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
}
阅读 Can we stop using AddWithValue() already? 了解为什么 AddWithValue
是个坏主意。
请注意,这仍在使用非 SARGable 谓词搜索多个列,因此 SQL 服务器无法对此处的任何条件使用索引查找。
因此 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
}
阅读 Can we stop using AddWithValue() already? 了解为什么 AddWithValue
是个坏主意。
请注意,这仍在使用非 SARGable 谓词搜索多个列,因此 SQL 服务器无法对此处的任何条件使用索引查找。