Si su lista de enteros es grande, puede terminar generando una cadena demasiado larga para que la base de datos la acepte. P.ej. Creo que la longitud máxima de un VARCHAR en SQL2000 es de alrededor de 8K.
Así que tienen un conjunto de método de ayuda algo así como el ejemplo siguiente, que devuelve una enumeración de cadenas, que luego pueden ser utilizados de la siguiente manera:
List<int> idList = ...;
using(SqlCommand command = ...)
{
...
foreach(string idString in ConcatenateValues(ids,",", maxLength, false))
{
command.Parameters[...] = idString;
// or command.CommandText = "SELECT ... IN (" + idString + ")...";
... execute command ...
}
}
El método de concatenación podría ser algo como lo siguiente:
public static IEnumerable<string> ConcatenateValues(IEnumerable<int> values, string separator, int maxLength, bool skipDuplicates)
{
IDictionary<int, string> valueDictionary = null;
StringBuilder sb = new StringBuilder();
if (skipDuplicates)
{
valueDictionary = new Dictionary<int, string>();
}
foreach (int value in values)
{
if (skipDuplicates)
{
if (valueDictionary.ContainsKey(value)) continue;
valueDictionary.Add(value, "");
}
string s = value.ToString(CultureInfo.InvariantCulture);
if ((sb.Length + separator.Length + s.Length) > maxLength)
{
// Max length reached, yield the result and start again
if (sb.Length > 0) yield return sb.ToString();
sb.Length = 0;
}
if (sb.Length > 0) sb.Append(separator);
sb.Append(s);
}
// Yield whatever's left over
if (sb.Length > 0) yield return sb.ToString();
}
que producirá una lista, no es una cadena que se puede utilizar en una instrucción SQL –
thecoop
thecoop: no he entendido bien su pregunta. Actualizado. –
@thecoop: No, no lo hará. @Mehrdad: No compilará; 'String.Join' solo toma una matriz. – SLaks