Share via


Parâmetros de comando

Os parâmetros são marcados no texto do comando com o caractere de ponto de interrogação. Por exemplo, a seguinte instrução SQL é marcada para um único parâmetro de entrada:

{call SalesByCategory('Produce', ?)}

Para melhorar o desempenho reduzindo o tráfego de rede, o provedor OLE DB do SQL Server Native Client não deriva automaticamente informações de parâmetro, a menos que ICommandWithParameters::GetParameterInfo ou ICommandPrepare::Prepare seja chamado antes da execução de um comando. Isso significa que o provedor OLE DB do SQL Server Native Client não faz isso automaticamente:

  • Verifique a exatidão do tipo de dados especificado com ICommandWithParameters::SetParameterInfo.

  • Mapeie do DBTYPE especificado nas informações de associação do acessador para o tipo de dados correto do SQL Server do parâmetro.

Os aplicativos receberão erros possíveis ou perda de precisão com um desses métodos, se especificarem tipos de dados não compatíveis com o tipo de dados do SQL Server do parâmetro.

Para garantir que isso não aconteça, o aplicativo deve:

  • Garantir que pwszDataSourceType corresponda aos tipos de dados do SQL Server do parâmetro em caso de hard-coding de ICommandWithParameters::SetParameterInfo.

  • Garantir que o valor DBTYPE associado ao parâmetro seja do mesmo tipo do tipo de dados do SQL Server do parâmetro em caso de hard-coding de um acessador.

  • Codifique o aplicativo para chamar ICommandWithParameters::GetParameterInfo de forma que o provedor possa obter os tipos de dados do SQL Server dos parâmetros dinamicamente. Observe que isso causa uma viagem de ida e volta na rede adicional até o servidor.

ObservaçãoObservação

O provedor não oferece suporte à chamada de ICommandWithParameters::GetParameterInfo em nenhuma instrução UPDATE ou DELETE do SQL Server que contenha uma cláusula FROM; em qualquer declaração SQL que dependa de uma subconsulta que contenha parâmetros; em instruções SQL que contenham marcadores de parâmetro em ambas as expressões de uma comparação, similar ou predicado quantificado ou em consultas nas quais um dos parâmetros é parâmetro de uma função. Ao processar um lote de instruções SQL, o provedor também não dá suporte à chamada de ICommandWithParameters::GetParameterInfo em marcadores de parâmetro nas instruções após a primeira instrução no lote. Não são permitidos comentários (/* */) no comando Transact-SQL.

O provedor OLE DB do SQL Server Native Client dá suporte a parâmetros de entrada em comandos de instrução SQL. Em comandos de chamada de procedimento, o provedor OLE DB do SQL Server Native Client oferece suporte a parâmetros de entrada, saída e entrada/saída. Os valores de parâmetro de saída são retornados para o aplicativo na execução (apenas se não houver nenhum conjunto de linhas retornado) ou quando todos os conjuntos de linhas retornados são esgotados pelo aplicativo. Para garantir a validade dos valores retornados, use IMultipleResults para forçar o consumo do conjunto de linhas.

Os nomes dos parâmetros de procedimento armazenado não precisam ser especificados em uma estrutura DBPARAMBINDINFO. Use NULL para o valor do membro pwszName a fim de indicar que o provedor de dados OLE DB do SQL Server Native Client deva ignorar o nome do parâmetro e usar apenas o ordinal especificado no membro rgParamOrdinals de ICommandWithParameters::SetParameterInfo. Caso o texto do comando contenha parâmetros nomeados e sem nome, todos os parâmetros sem nome devem ser especificados antes de qualquer parâmetro nomeado.

Caso o nome de um parâmetro de procedimento armazenado seja especificado, o provedor OLE DB do SQL Server Native Client verifica o nome para garantir sua validade. O provedor OLE DB do SQL Server Native Client retorna um erro ao receber um nome de parâmetro incorreto do consumidor.

ObservaçãoObservação

Para expor o suporte a XML e à UDT (tipos definidos pelo usuário) do SQL Server, o provedor OLE DB do SQL Server implementa uma nova interface ISSCommandWithParameters.

Consulte também

Conceitos