Estoy tratando de pasar el parámetro de matriz al comando SQL en C # como a continuación, pero no funciona. ¿Alguien lo conoce antes?
string sqlCommand = "SELECT * from TableA WHERE Age IN (@Age)";
SqlConnection sqlCon = new SqlConnection(connectString);
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlCon;
sqlComm.CommandType = System.Data.CommandType.Text;
sqlComm.CommandText = sqlCommand;
sqlComm.CommandTimeout = 300;
sqlComm.Parameters.Add("@Age", SqlDbType.NVarChar);
StringBuilder sb = new StringBuilder();
foreach (ListItem item in ddlAge.Items)
{
if (item.Selected)
{
sb.Append(item.Text + ",");
}
}
sqlComm.Parameters["@Age"].Value = sb.ToString().TrimEnd(',');
Respuestas:
Deberá agregar los valores en la matriz de uno en uno.
ACTUALIZACIÓN: Aquí hay una solución extendida y reutilizable que utiliza la respuesta de Adam junto con su edición sugerida. Lo mejoré un poco y lo convertí en un método de extensión para que sea aún más fácil llamar.
Se llama así ...
Observe que "{Age}" en la instrucción sql es el mismo que el nombre del parámetro que estamos enviando a AddArrayParameters. AddArrayParameters reemplazará el valor con los parámetros correctos.
fuente
var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Esto debería ayudar a los desarrolladores si se olvidan de hacer coincidir paramNameRoot con la consulta.Quería ampliar la respuesta de que Brian contribuyó a hacer esto fácilmente utilizable en otros lugares.
Puede usar esta nueva función de la siguiente manera:
Editar: Aquí hay una variación genérica que funciona con una matriz de valores de cualquier tipo y se puede usar como un método de extensión:
Luego puede usar este método de extensión de la siguiente manera:
Asegúrese de configurar CommandText antes de llamar a AddArrayParameters.
También asegúrese de que el nombre de su parámetro no coincida parcialmente con nada más en su declaración (es decir, @AgeOfChild)
fuente
AddWithValue
función, ¿hay alguna posibilidad de que pueda solucionarlo?Si puede usar una herramienta como "apuesto", esto puede ser simplemente:
Dapper se encargará de desenvolver esto a parámetros individuales para usted .
fuente
'{1,2,3}'
argumentos de estilo para una función (no una cláusula WHERE IN), pero prefiero usar ODBC simple si no problemas de matriz. Supongo que necesitaría Dapper ODBC también en este caso. Esto es lo que quiere sacar. snipboard.io/HU0RpJ.jpg . Tal vez debería leer más sobre Dapper ...Si está utilizando MS SQL Server 2008 y superior, puede usar parámetros con valores de tabla como se describe aquí http://www.sommarskog.se/arrays-in-sql-2008.html .
1. Cree un tipo de tabla para cada tipo de parámetro que usará
El siguiente comando crea un tipo de tabla para enteros:
2. Implemente métodos auxiliares
3. Úselo así
fuente
table.Rows.Add(id);
produce un olor de código menor cuando se utiliza SonarQube. He utilizado esta alternativa dentro del foreach:var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Como hay un método en
Puede ser más conveniente crear un método que acepte un parámetro (nombre) para reemplazar y una lista de valores. No está en el nivel de Parámetros (como AddWithValue ) sino en el comando en sí mismo, por lo que es mejor llamarlo AddParametersWithValues y no solo AddWithValues :
consulta:
uso:
El método de extensión:
fuente
Quiero proponer otra forma, cómo resolver la limitación con el operador IN.
Por ejemplo tenemos la siguiente consulta
Queremos pasar varias ID para filtrar usuarios. Lamentablemente, no es posible hacer con C # de manera fácil. Pero he encontrado una solución alternativa para esto usando la función "string_split". Necesitamos reescribir un poco nuestra consulta a continuación.
Ahora podemos pasar fácilmente una enumeración de valores de parámetros separados por comas.
fuente
Pasar una matriz de elementos como un parámetro colapsado a la cláusula WHERE..IN fallará ya que la consulta tomará forma de
WHERE Age IN ("11, 13, 14, 16")
.Pero puede pasar su parámetro como una matriz serializada a XML o JSON:
Utilizando el
nodes()
método:Utilizando el
OPENXML
método:Eso es un poco más en el lado de SQL y necesita un XML adecuado (con root).
Usando el
OPENJSON
método (SQL Server 2016+):Tenga en cuenta que para el último método también debe tener un nivel de compatibilidad de más de 130.
fuente
Descripción general: utilice DbType para establecer el tipo de parámetro.
fuente
Uso
.AddWithValue()
, entonces:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Alternativamente, podría usar esto:
Su ejemplo de código total se verá a continuación:
fuente
Aquí hay una variante menor de la respuesta de Brian que alguien más puede encontrar útil. Toma una lista de claves y la coloca en la lista de parámetros.
fuente
tratar
fuente
pruébalo así
fuente