Как передать неизвестное количество параметров в SQL-запрос из C #? - PullRequest
2 голосов
/ 05 августа 2010

У меня есть простой запрос, в котором ОТ меня есть что-то вроде:

WHERE ([Comment]  LIKE '%something%'
      OR [Comment] LIKE '%aaaa%'
      OR [Commnet] LIKE '%ccc') 
AND Replace([Number], ' ', '') = @number

К сожалению, теперь это жестко запрограммировано в коде, поэтому, если что-то изменится (больше OR в поле [Comment], я должен пойти и изменить его в коде. Можно ли передать [Comment] как параметр с несколькими значениями (неизвестно мне), поэтому я буду создавать таблицу SQL с каждым комментарием, который я хочу использовать в этом запросе (и пользователи смогут добавлять новые изнутри программы, чтобы об этом автоматически заботились?

  using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails)) 
        using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
            sqlQuery.Parameters.AddWithValue("@number", varNumber);
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                while (sqlQueryResult.Read()) {
                    string varID = sqlQueryResult["ID"].ToString();

                }
        }

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Вы можете использовать параметры табличных значений в SQL Server 2008.

В более ранних версиях вы могли передавать параметр XML и анализировать данные с помощью XPath.

Для более глубокого анализа различных опций прочитайте эту статью Эрланда Соммарскога (SQL Server 2005) и дополнительную статью о SQL Server 2008.

1 голос
/ 05 августа 2010

Даже если решение Oded кажется лучшим способом (о котором я до сих пор не знал), я в настоящее время автоматически собираю команду и параметры каким-то образом, как это (что в настоящее время не соответствуетваша проблема, потому что вы используете like):

// Some sql statement with a placeholder for all parameters (@ID0, @ID1, @ID2, ...)
string sql = "select * from table where ID in ( {0} )";

// Create a list of items of @ID0, 3; @ID1, 8; ...
var parameters = myList.Where(item => item.MatchesSomeCondition())
                       .Select((item, index) => new
                               {
                                   Name = "@ID" + index,
                                   Value = item.ID
                               });

// Add all parameters to the sqlCmd
foreach(parameter in parameters)
{
    sqlCmd.Parameters.AddWithValue(parameter.Name, parameter.Value);
}

// Insert all @IDx into the sql statement
// Result: "select * from table where ID in ( @ID0, @ID1, @ID2, ... )"
sqlCmd.CommandText = String.Format(sql, String.Join(", ", parameters.Select(parameter => parameter.Name).ToArray()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...