ฉันต้องการขยายคำตอบที่ไบรอันสนับสนุนเพื่อให้ใช้งานได้ง่ายในที่อื่น
/// <summary>
/// This will add an array of parameters to a SqlCommand. This is used for an IN statement.
/// Use the returned value for the IN part of your SQL call. (i.e. SELECT * FROM table WHERE field IN (returnValue))
/// </summary>
/// <param name="sqlCommand">The SqlCommand object to add parameters to.</param>
/// <param name="array">The array of strings that need to be added as parameters.</param>
/// <param name="paramName">What the parameter should be named.</param>
protected string AddArrayParameters(SqlCommand sqlCommand, string[] array, string paramName)
{
/* An array cannot be simply added as a parameter to a SqlCommand so we need to loop through things and add it manually.
* Each item in the array will end up being it's own SqlParameter so the return value for this must be used as part of the
* IN statement in the CommandText.
*/
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)