Я хотел расширить ответ Брайана, чтобы его можно было легко использовать в других местах.
protected string AddArrayParameters(SqlCommand sqlCommand, string[] array, string paramName)
{
var parameters = new string[array.Length];
for (int i = 0; i < array.Length; i++)
{
parameters[i] = string.Format("@{0}{1}", paramName, i);
sqlCommand.Parameters.AddWithValue(parameters[i], array[i]);
}
return string.Join(", ", parameters);
}
Вы можете использовать эту новую функцию следующим образом:
SqlCommand cmd = new SqlCommand();
string ageParameters = AddArrayParameters(cmd, agesArray, "Age");
sql = string.Format("SELECT * FROM TableA WHERE Age IN ({0})", ageParameters);
cmd.CommandText = sql;
Изменить: вот общий вариант, который работает с массивом значений любого типа и может использоваться как метод расширения:
public static class Extensions
{
public static void AddArrayParameters<T>(this SqlCommand cmd, string name, IEnumerable<T> values)
{
name = name.StartsWith("@") ? name : "@" + name;
var names = string.Join(", ", values.Select((value, i) => {
var paramName = name + i;
cmd.Parameters.AddWithValue(paramName, value);
return paramName;
}));
cmd.CommandText = cmd.CommandText.Replace(name, names);
}
}
Затем вы можете использовать этот метод расширения следующим образом:
var ageList = new List<int> { 1, 3, 5, 7, 9, 11 };
var cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM MyTable WHERE Age IN (@Age)";
cmd.AddArrayParameters("Age", ageList);
Убедитесь, что вы установили CommandText перед вызовом AddArrayParameters.
Также убедитесь, что имя вашего параметра не будет частично соответствовать чему-либо еще в вашем заявлении (например, @AgeOfChild)