Member 12674879 Ответов: 2

Каков наилучший способ поиска нескольких столбцов для одного и того же значения с помощью oledbcommand


Следовательно, поставщик OLE DB .NET не поддерживает именованные параметры, есть ли лучший или более быстрый способ поиска нескольких столбцов? например, просто использовать один параметр?

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 + "%");


Что я уже пробовал:

Если я использую только один параметр, то значение для второго параметра не будет найдено

2 Ответов

Рейтинг:
12

Member 12674879

использование 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
}


Рейтинг:
0

OriginalGriff

Нет, нет никакого универсального "спецификатора столбцов", который вы можете использовать. Вы мог сделайте это, объединив все значения столбцов вместе и проверив, что:

WHERE Column1 + '|' + Column2  + '|' + Column3 + '|' + Column4 + '|' + Column5 + '|' + Column6 + '|' + Column7 + '|' + Column8 + '|' + Column9 + '|' + Column10 LIKE ? "
Тогда вам нужно будет указать этот параметр только один раз, но я настоятельно рекомендую вам этого не делать, так как он эффективно открывает вашу БД до SQL - инъекции, если какой-либо столбец содержит данные, которые пользователь может ввести, а также другие проблемы.

Я бы удивился, почему ваша БД организована именно так, а не хранит каждое значение столбца в отдельной строке другой таблицы, доступ к которой осуществляется через внешний ключ.