Использование элементов из списка <string>в запросе SQL - PullRequest
1 голос
/ 13 июля 2010

Хорошо, у меня есть список, который состоит из набора значений из SQL-запроса, эта часть работает нормально.То, что я хочу сделать, это использовать элементы в этом списке, чтобы указать другому запросу, что искать.Итак, он говорит о том, что должен возвращать все столбцы из CMMReports, где PartNumber похож на% listItem1..2 ... 3%, любой совет?

List<string> ImportedParts = GetImportedPartNumbers();

string query = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND PartNumber LIKE %" + ImportedParts + "% ORDER BY CreatedOn DESC;";

Ответы [ 4 ]

1 голос
/ 13 июля 2010

Не то чтобы я оправдал это, поскольку вы должны использовать параметризованные запросы.Однако это должно работать:

StringBuilder partNumbers = new StringBuilder();
foreach (string queryValue in ImportedParts)
{
    string q = "PartNumber LIKE '%" + queryValue + "%'";
    if (string.IsNullOrEmpty(partNumbers.ToString())
    {
       partNumbers.Append(q);
    }
    else
    {
       partNumbers.Append(" OR " + q);
    }
}

string query = string.Format("SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') " +
           "AND (FilePath NOT LIKE '%js91162%') AND ({0}) " +
           "ORDER BY CreatedOn DESC;", partNumbers.ToString());
0 голосов
/ 13 июля 2010

Я хотел бы рассмотреть возможность сделать это в хранимой процедуре и передать в ваш список параметр Xml.

См. Следующую статью для получения дополнительной информации об использовании параметров Xml в хранимой процедуре:

Передача списков в SQL Server 2005 с параметрами XML - Джон Галлоуэй

Форма, в которой вы можете легко использовать данные списка внутри хранимого процесса, используя синтаксис Xml, и рассматривать их почти как другое.таблица данных.

0 голосов
/ 13 июля 2010

Вы можете искать IN clouse для SQL таким образом, чтобы получить ответ для частей, которые SQL Server может найти в базе данных. Использование WHERE x = y для всех элементов означает, что если один элемент не может быть найден, весь запрос ничего не возвращает.

0 голосов
/ 13 июля 2010

Не проверено, но вы должны понять:

List<string> ImportedParts = GetImportedPartNumbers(); 

SqlCommand cmd = myConnection.CreateCommand();
cmd.CommandText = "SELECT * FROM CMMReports WHERE (RacfId IS NULL OR RacfId = '') AND (FilePath NOT LIKE '%js91162%') AND (";

int i = 0;
foreach (string part in ImportedParts) {
    cmd.AddParameterWithValue("@param" + i.ToString(), "%" + part + "%");
    if (i != 0) cmd.CommandText += " OR"
    cmd.CommandText += " PartNumber LIKE @param" + i.ToString();
    i++;
}

cmd.CommandText += ") ORDER BY CreatedOn DESC;";

Это решение использует параметризованный запрос вместо простого добавления строк в SQL, что считается потенциальной угрозой безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...