Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET Framework
.NET
.NET Standard
Os objetos de comando usam parâmetros para passar valores para instruções SQL ou procedimentos armazenados, fornecendo verificação e validação de tipo. Ao contrário do texto do comando, a entrada de parâmetros é tratada como um valor literal, não como código executável. Esse comportamento ajuda a proteger contra ataques de "injeção de SQL", nos quais um invasor insere um comando que compromete a segurança no servidor em uma instrução SQL.
Os comandos parametrizados também podem melhorar o desempenho da execução de consultas, pois ajudam o servidor de banco de dados a corresponder com precisão o comando de entrada com um plano de consulta em cache adequado. Para obter mais informações, consulte Cache e reutilização do plano de execução e Parâmetros e Reutilização do plano de execução. Além dos benefícios de segurança e desempenho, os comandos parametrizados fornecem um método conveniente para organizar os valores passados para uma fonte de dados.
Um DbParameter objeto pode ser criado usando o seu construtor, ou ao adicioná-lo ao DbParameterCollection, ao chamar o método Add da coleção DbParameterCollection. O Add método tomará como entrada argumentos do construtor ou um objeto de parâmetro existente, dependendo do provedor de dados.
Forneça a propriedade ParameterDirection
Ao adicionar parâmetros, você deve fornecer uma ParameterDirection propriedade para parâmetros diferentes dos parâmetros de entrada. A tabela a seguir mostra os ParameterDirection valores que você pode usar com a ParameterDirection enumeração.
| Nome do membro | Description |
|---|---|
| Input | O parâmetro é um parâmetro de entrada. Esse valor é o padrão. |
| InputOutput | O parâmetro pode executar entrada e saída. |
| Output | O parâmetro é um parâmetro de saída. |
| ReturnValue | O parâmetro representa um valor de retorno de uma operação, como um procedimento armazenado, função interna ou função definida pelo usuário. |
Trabalhar com variáveis de substituição para parâmetros
A sintaxe dos espaços reservados para parâmetros depende da fonte de dados. O Microsoft SqlClient Data Provider for SQL Server lida com nomenclatura e especificação de parâmetros e espaços reservados de parâmetros de forma diferente. O provedor de dados SqlClient usa parâmetros nomeados no formato @parametername.
Especificar tipos de dados de parâmetros
O tipo de dados de um parâmetro é específico para o Microsoft SqlClient Data Provider for SQL Server. Especificar o tipo converte o valor de Parameter para o tipo Microsoft SqlClient Data Provider for SQL Server antes de passar o valor para a fonte de dados. Você também pode especificar o tipo da Parameter de uma maneira genérica definindo a DbTypeParameter propriedade do objeto como um determinado DbType.
O tipo do objeto Parameter do Microsoft SqlClient Data Provider para SQL Server é inferido a partir do tipo .NET Framework do Value do objeto Parameter, ou do DbType do objeto Parameter. A tabela a seguir mostra o tipo inferido Parameter com base no objeto passado como valor de Parameter ou o especificado em DbType.
| Tipo .NET | DbType | SqlDbType |
|---|---|---|
| Boolean | Boolean |
Bit |
| Byte | Byte |
TinyInt |
byte[] |
Binary |
VarBinary. Essa conversão implícita falhará se a matriz de bytes for maior do que o tamanho máximo de um VarBinary, que é de 8000 bytes. Para matrizes de bytes maiores que 8000 bytes, defina explicitamente o SqlDbType. |
| Char | Não é suportado inferir um SqlDbType a partir de char. | |
| DateTime | DateTime |
DateTime |
| DateTimeOffset | DateTimeOffset |
DateTimeOffset no SQL Server 2008. Não há suporte para inferir um SqlDbType de DateTimeOffset em versões do SQL Server anteriores ao SQL Server 2008. |
| Decimal | Decimal |
Decimal |
| Double | Double |
Float |
| Single | Single |
Real |
| Guid | Guid |
UniqueIdentifier |
| Int16 | Int16 |
SmallInt |
| Int32 | Int32 |
Int |
| Int64 | Int64 |
BigInt |
| Object | Object |
Variant |
| String | String |
NVarChar. Essa conversão implícita falhará se a cadeia de caracteres for maior do que o tamanho máximo de um NVarChar, que é de 4000 caracteres. Para strings maiores que 4000 caracteres, defina explicitamente o SqlDbType. |
| TimeSpan | Time |
Time no SQL Server 2008. Não há suporte para inferir um SqlDbType de TimeSpan em versões do SQL Server anteriores ao SQL Server 2008. |
| UInt16 | UInt16 |
Não há suporte para inferir um SqlDbType de UInt16 . |
| UInt32 | UInt32 |
Não há suporte para inferir um SqlDbType de UInt32 . |
| UInt64 | UInt64 |
Não há suporte para inferir um SqlDbType de UInt64 . |
AnsiString |
VarChar |
|
AnsiStringFixedLength |
Char |
|
Currency |
Money |
|
Date |
Date no SQL Server 2008. Não há suporte para inferir um SqlDbType de Date em versões do SQL Server anteriores ao SQL Server 2008. |
|
SByte |
Não há suporte para inferir um SqlDbType de SByte . |
|
StringFixedLength |
NChar |
|
Time |
Time no SQL Server 2008. Não há suporte para inferir um SqlDbType de Time em versões do SQL Server anteriores ao SQL Server 2008. |
|
VarNumeric |
Não há suporte para inferir um SqlDbType de VarNumeric . |
|
| Tipo definido pelo usuário (um objeto com SqlUserDefinedAggregateAttribute) | SqlClient sempre retorna um objeto |
SqlDbType.Udt se SqlUserDefinedTypeAttribute estiver presente, caso contrário Variant |
| SqlJson | String |
SqlDbType.Json |
| SqlVector<T> | Binary |
SqlDbType.Vector |
Observação
As conversões de decimal para outros tipos são conversões estreitas que arredondam o valor decimal para o valor inteiro mais próximo em direção a zero. Se o resultado da conversão não for representável no tipo de destino, um OverflowException será lançado.
Observação
JSON
Defina SqlDbType como Json ao passar um parâmetro Value do tipo string. Caso contrário, SqlDbType assume como Nvarcharpadrão.
Vetor
Para o tipo de dados vetoriais SQL, um parâmetro Value do tipo Microsoft.Data.SqlTypes.SqlVector<T> deve ser especificado. O parâmetro Size e a dimensão vetorial são inferidos a partir do parâmetro Value. O parâmetro Size é ignorado.
Observação
Quando você envia um valor de parâmetro nulo para o servidor, você deve especificar DBNull, não null (Nothing no Visual Basic). O valor nulo no sistema é um objeto vazio que não tem valor.
DBNull é usado para representar valores nulos.
Derivar informações de parâmetros
Os parâmetros também podem ser derivados de um procedimento armazenado usando a DbCommandBuilder classe. A SqlCommandBuilder classe fornece um método estático, DeriveParameters, que preenche automaticamente a coleção de parâmetros de um objeto de comando que usa informações de parâmetros de um procedimento armazenado.
DeriveParameters substitui qualquer informação de parâmetro existente para o comando.
Observação
A derivação de informações de parâmetros incorre em uma penalidade de desempenho porque requer uma viagem de ida e volta adicional à fonte de dados para recuperar as informações. Se as informações de parâmetros forem conhecidas em tempo de design, você poderá melhorar o desempenho do seu aplicativo definindo os parâmetros explicitamente.
Para obter mais informações, consulte Gerando comandos com CommandBuilders.
Usando parâmetros com um SqlCommand e um procedimento armazenado
Os procedimentos armazenados oferecem muitas vantagens em aplicativos controlados por dados. Usando procedimentos armazenados, as operações de banco de dados podem ser encapsuladas em um único comando, otimizadas para melhor desempenho e aprimoradas com segurança extra. Embora um procedimento armazenado possa ser chamado passando o nome do procedimento armazenado seguido por argumentos de parâmetro como uma instrução SQL, o Parameters uso da coleção do objeto ADO.NET DbCommand permite que você defina mais explicitamente os parâmetros do procedimento armazenado e acesse os parâmetros de saída e os valores de retorno.
Observação
As instruções parametrizadas são executadas no servidor usando sp_executesql, o que permite a reutilização do plano de consulta. Cursores locais ou variáveis no sp_executesql lote não são visíveis para o lote que chama sp_executesql. As alterações no contexto do banco de dados duram apenas até o final da sp_executesql instrução. Para obter mais informações, consulte sp_executesql (Transact-SQL).
Ao usar parâmetros com a SqlCommand para executar um procedimento armazenado do SQL Server, os nomes dos parâmetros adicionados à coleção devem corresponder aos Parameters nomes dos marcadores de parâmetro no procedimento armazenado. O Microsoft SqlClient Data Provider for SQL Server não oferece suporte ao espaço reservado de ponto de interrogação (?) para passar parâmetros para uma instrução SQL ou um procedimento armazenado. Ele trata os parâmetros no procedimento armazenado como parâmetros nomeados e procura marcadores de parâmetros correspondentes. Por exemplo, o CustOrderHist procedimento armazenado é definido usando um parâmetro chamado @CustomerID. Quando o código executa o procedimento armazenado, ele também deve usar um parâmetro chamado @CustomerID.
CREATE PROCEDURE dbo.CustOrderHist @CustomerID varchar(5)
Example
Este exemplo demonstra como chamar um procedimento armazenado do Northwind SQL Server no banco de dados de exemplo. O nome do procedimento armazenado é dbo.SalesByCategory e tem um parâmetro de entrada nomeado @CategoryName com um tipo de dados de nvarchar(15). O código cria um novo SqlConnection dentro de um bloco de uso para que a conexão seja descartada quando o procedimento terminar. Os SqlCommand objetos e SqlParameter são criados e suas propriedades definidas. A SqlDataReader executa o SqlCommand e retorna o conjunto de resultados do procedimento armazenado, exibindo a saída na janela do console.
Observação
Em vez de criar SqlCommand e SqlParameter objetos e, em seguida, definir propriedades em instruções separadas, você pode optar por usar um dos construtores sobrecarregados para definir várias propriedades em uma única instrução.
static void GetSalesByCategory(string connectionString,
string categoryName)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Create the command and set its properties.
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SalesByCategory";
command.CommandType = CommandType.StoredProcedure;
// Add the input parameter and set its properties.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@CategoryName";
parameter.SqlDbType = SqlDbType.NVarChar;
parameter.Direction = ParameterDirection.Input;
parameter.Value = categoryName;
// Add the parameter to the Parameters collection.
command.Parameters.Add(parameter);
// Open the connection and execute the reader.
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}
}