首页 > 解决方案 > 使用 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 + "%");

如果我只使用单个参数,则找不到第二个参数的值

标签: c#sql-server-2008parametersoledb

解决方案


仅发送一次参数的一种方法是使用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 无法对此处的任何条件使用索引搜索。


推荐阅读