Eu estou tentando passar o parâmetro de matriz para SQL commnd em c # como abaixo, mas não funciona. Alguém conhece isso 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(',');
Respostas:
Você precisará adicionar os valores na matriz, um de cada vez.
ATUALIZAÇÃO: Aqui está uma solução estendida e reutilizável que usa a resposta de Adam junto com sua edição sugerida. Eu o melhorei um pouco e o tornei um método de extensão para facilitar ainda mais a chamada.
É assim chamado ...
Observe que "{Age}" na instrução sql é igual ao nome do parâmetro que estamos enviando para AddArrayParameters. AddArrayParameters substituirá o valor pelos parâmetros corretos.
fonte
var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Isso deve ajudar os desenvolvedores se eles esquecerem de corresponder paramNameRoot à consulta.Eu queria expandir a resposta que Brian contribuiu para tornar isso facilmente utilizável em outros lugares.
Você pode usar esta nova função da seguinte maneira:
Edit: Aqui está uma variação genérica que funciona com uma matriz de valores de qualquer tipo e é utilizável como um método de extensão:
Você pode usar esse método de extensão da seguinte maneira:
Certifique-se de definir o CommandText antes de chamar AddArrayParameters.
Além disso, verifique se o nome do parâmetro não corresponde parcialmente a mais nada em sua declaração (por exemplo, @AgeOfChild)
fonte
AddWithValue
função, alguma chance de você consertar isso?Se você pode usar uma ferramenta como "dapper", isso pode ser simplesmente:
O Dapper tratará de desembrulhar isso em parâmetros individuais para você .
fonte
'{1,2,3}'
argumentos de estilo de uma função (não uma cláusula WHERE IN), mas prefiro usar ODBC comum, se não aborrecimento da matriz. Presumo que precisaria do Dapper ODBC também neste caso. Aqui está o que ele quer puxar. snipboard.io/HU0RpJ.jpg . Talvez eu devesse ler mais sobre Dapper ...Se você estiver usando o MS SQL Server 2008 e acima, poderá usar parâmetros com valor de tabela, como descrito aqui http://www.sommarskog.se/arrays-in-sql-2008.html .
1. Crie um tipo de tabela para cada tipo de parâmetro que você usará
O comando a seguir cria um tipo de tabela para números inteiros:
2. Implementar métodos auxiliares
3. Use-o assim
fonte
table.Rows.Add(id);
resulta em um pequeno cheiro de código ao usar o SonarQube. Eu usei essa alternativa dentro do foreach:var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Como existe um método em
pode ser mais conveniente criar um método que aceite um parâmetro (nome) para substituir e uma lista de valores. Não está no nível Parâmetros (como AddWithValue ), mas no próprio comando, por isso é melhor chamá-lo de AddParametersWithValues e não apenas AddWithValues :
inquerir:
uso:
o método de extensão:
fonte
Quero propor outra maneira, como resolver a limitação com o operador IN.
Por exemplo, temos a seguinte consulta
Queremos passar vários IDs para filtrar usuários. Infelizmente, não é possível fazer com o C # de maneira fácil. Mas eu tenho uma solução alternativa para isso usando a função "string_split". Precisamos reescrever um pouco nossa consulta para seguir.
Agora podemos passar facilmente uma enumeração de parâmetros com valores separados por vírgula.
fonte
Passar uma matriz de itens como um parâmetro recolhido para a cláusula WHERE..IN falhará, pois a consulta assumirá a forma de
WHERE Age IN ("11, 13, 14, 16")
.Mas você pode passar seu parâmetro como uma matriz serializada para XML ou JSON:
Usando o
nodes()
método:Usando o
OPENXML
método:Isso é um pouco mais do lado SQL e você precisa de um XML adequado (com raiz).
Usando o
OPENJSON
método (SQL Server 2016 ou superior):Observe que, para o último método, você também precisa ter o Nível de compatibilidade em mais de 130.
fonte
Visão geral: use o DbType para definir o tipo de parâmetro.
fonte
Use
.AddWithValue()
, então:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Como alternativa, você pode usar isso:
Seu exemplo de código total analisará a seguir:
fonte
Aqui está uma variante menor da resposta de Brian que outra pessoa pode achar útil. Pega uma lista de chaves e a coloca na lista de parâmetros.
fonte
experimentar
fonte
tente assim
fonte