ADO.NET retorna 0 incorretamente de uma função definida pelo usuário do SQL Server

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 329497
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sintomas
Quando você chamar uma função definida pelo usuário do Microsoft SQL Server a partir de um aplicativo do Microsoft ADO.NET, a função definida pelo usuário retorna 0 em vez do valor de retorno esperado. Esse comportamento ocorre quando você chamar uma função definida pelo usuário usando o provedor gerenciado do SQL Server, provedor OLE DB gerenciado ou o provedor gerenciado do ODBC.
Como Contornar
Para contornar esse comportamento, chame a função definida pelo usuário em uma instrução Transact-SQL Select , como "Select dbo. [Function Name] (Parameters)" em vez de chamar a função definida pelo usuário diretamente.

Etapas para contornar o problema

  1. Crie uma nova função definida pelo usuário chamada Function1 no banco de dados Pubs do Microsoft SQL Server. Para fazer isso, execute o comando Transact-SQL a seguir no Microsoft SQL Query Analyzer:
    CREATE FUNCTION dbo.Function1()RETURNS nvarchar(20) ASBEGIN   declare @out nvarchar(20)   set @out = 'Hello World'   RETURN @outEND
  2. No Microsoft Visual Studio. NET, crie um novo console do projeto de aplicativo usando Visual Basic.NET. Por padrão, Module1.vb é criado.
  3. Adicione os namespaces a seguir no início de Module1.vb:
    Imports SystemImports System.Data.SqlClient
  4. Adicione o seguinte código ao método Sub Main em Module1.vb:
          ' Open a connection to the SQL Server Pubs database.      Dim sqlConnection1 As New SqlConnection("Integrated Security=SSPI;data source=SERVERNAME;initial catalog=pubs;persist security info=True;")      sqlConnection1.Open()      ' Create a command object to call Function1.      Dim sqlCommand1 As New SqlCommand()      With sqlCommand1         .CommandText = "Select dbo.[Function1]()"         .CommandType = CommandType.Text         .Connection = sqlConnection1      End With      Dim sqlDataReader1 As SqlDataReader      ' Call Function1.      sqlDataReader1 = sqlCommand1.ExecuteReader      sqlDataReader1.Read()      Dim strRetVal As String      strRetVal = sqlDataReader1.Item(0)      MsgBox("Return Value from UDF is = " & strRetVal)      sqlDataReader1.Close()
  5. Modificar a seqüência de conexão adequadamente para seu ambiente.
  6. No menu Debug , clique em Iniciar para executar o aplicativo. Observe que a função definida pelo usuário do SQL Server retorna Hello World .
Mais Informações

Passos para reproduzir o problema

  1. Crie uma função definida pelo usuário no Microsoft SQL Server, conforme descrito na etapa 1 da seção "Solução".
  2. No Visual Studio. NET, crie um novo aplicativo console projeto usando Visual Basic.NET. Por padrão, Module1.vb é criado.
  3. Adicione os namespaces a seguir no início de Module1.vb:
    Imports SystemImports System.Data.SqlClient
  4. Adicione o seguinte código ao método Sub Main em Module1.vb:
          ' Connect to the SQL Server Pubs database.      Dim sqlConnection1 As New SqlConnection("Integrated Security=SSPI;data source=SERVERNAME;initial catalog=pubs;persist security info=True;")      SqlConnection1.Open()      ' Create a command object to call Function1.      Dim sqlCommand1 As New SqlCommand()      Dim sqlDataReader1 As SqlDataReader      ' Function to call:      sqlCommand1.CommandText = "dbo.[function1]"      sqlCommand1.CommandType = System.Data.CommandType.Text      sqlCommand1.Connection = sqlConnection1      ' Add parameters to get the Return Value.      sqlCommand1.Parameters.Add(New SqlClient.SqlParameter("@out", SqlDbType.NVarChar, 20))      sqlCommand1.Parameters("@out").Direction = ParameterDirection.ReturnValue      sqlCommand1.Parameters("@out").Value = "<NULL>"      ' Call Function1.      sqlDataReader1 = sqlCommand1.ExecuteReader()      sqlDataReader1.Read()      sqlDataReader1.Close()      Dim strRetVal As String      strRetVal = sqlCommand1.Parameters("@out").Value      MsgBox("Return Value for @out = " & strRetVal)
  5. Modificar a seqüência de conexão adequadamente para seu ambiente.
  6. No menu Debug , clique em Iniciar para executar o aplicativo.
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
306574COMO: Chamada SQL Server procedimentos armazenados no ASP.NET usando o Visual Basic .NET
309486COMO: Executar SQL com parâmetros procedimentos armazenados usando o provedor ODBC .NET e Visual Basic .NET
308051PROBLEMA: Parâmetros de saída não são retornados ao executar um comando ADO.NET no Visual Basic .NET
194792COMO: Recuperar valores no SQL Server armazenados procedimentos com o ADO
Para obter mais informações, visite os seguintes sites:

Proprietăți

ID articol: 329497 - Ultima examinare: 03/19/2007 09:07:00 - Revizie: 1.3

Microsoft ADO.NET 1.0

  • kbmt kbtshoot kbtsql kbsystemdata kbstoredproc kbsqlclient kbprovider kbdatabase kbpending kbprb KB329497 KbMtpt
Feedback