CORRECÇÃO: A configuração para a precisão e a escala dos dados que são retornados de um procedimento armazenado saída parâmetro é (38,0) quando um valor nulo é retornado no SQL Server 2000

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: 892406
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Bug #: 473209 (SQL Server 8.0)
Sintomas
Suponha que o cenário a seguir: no Microsoft SQL Server 2000, um parâmetro de saída do procedimento armazenado usa um tipo de dados decimal ou um tipo de dados numéricos. Quando é retornado um valor nulo, a configuração para a precisão e a escala dos dados retornados pelo procedimento armazenado saída parâmetro é (38,0) . Essa configuração é mantida em chamadas subseqüentes para o procedimento armazenado. Esse comportamento pode causar dados a ser arredondado para um valor inteiro.

Esse problema se aplica somente a aplicativos que usam o namespace System.Data.SqlClient . Esse problema não afeta aplicativos que usam outro APIs acesso a dados.

Por exemplo, você tem um procedimento armazenado que tem um parâmetro de saída DECIMAL(19,4) . Em seguida, você chamar o procedimento armazenado de um método SqlCommand.ExecuteNonQuery parametrizado.
CREATE PROCEDURE ParameterPrecisionTest(	@pIn DECIMAL(19,4), 	@pOut DECIMAL(19,4) OUTPUT) AS	SET @pOut = @pIn
quando você fizer isso, você os seguintes sintomas:
  1. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para 1.5 , 1.5 é retornado.
  2. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para DBNull , System.DBNull é retornado.
  3. Quando você chamar o método ExecuteNonQuery e definir o parâmetro de saída SqlParameter para 1.5 , 2 é retornado.
Observação Na segunda chamada para o procedimento armazenado, a precisão e a escala são redefinidas para (38,0) . Um valor de 2 é retornado na terceira chamada para o procedimento armazenado.
Causa
Esse problema ocorre porque o SQL Server redefine a precisão e a escala para (38,0) quando as seguintes condições forem verdadeiras:
  • Você chama um procedimento armazenado que contém um parâmetro de saída SqlParameter .
  • Defina o parâmetro para DBNull .
Resolução

Informações sobre o service pack

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o SQL Server 2000 service pack mais recente
Situação
Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 4.
Mais Informações

Etapas para reproduzir o problema

Execute o seguinte código translation from VPE for Csharp Visual.
using System;using System.Data.SqlClient;using System.Data;namespace MyApplication{	/// <summary>	/// Summary description for Class1.	/// </summary>	class MyClass	{		/// <summary>		/// The main entry point for the application.		/// </summary>		[STAThread]		static void Main(string[] args)		{						string strConn = "Server=(local);Database=Northwind;" + 				"Trusted_Connection=Yes;";			SqlConnection cn = new SqlConnection(strConn);			// Create stored procedure.			PrepDb(cn);			// Simple stored procedure.			//    Input and output parameters decimal(19, 4).			//    Sets the output parameter value to the input parameter value.			SqlCommand cmd = cn.CreateCommand();			cmd.CommandText = "ParameterPrecisionTest";			cmd.CommandType = CommandType.StoredProcedure;			SqlParameter pIn = cmd.Parameters.Add("@pIn", SqlDbType.Decimal);			pIn.Precision = 19;			pIn.Scale = 4;			SqlParameter pOut = cmd.Parameters.Add("@pOut", SqlDbType.Decimal);			pOut.Precision = 19;			pOut.Scale = 4;			pOut.Direction = ParameterDirection.Output;			cn.Open();			// Print value, precision, and scale for the output parameter.			CheckParameter("Pre-execution", pOut);			// The first call to the procedure returns 1.5.			pIn.Value = 1.5;			cmd.ExecuteNonQuery();			CheckParameter("Returning 1.5", pOut);			// The second call to the procedure returns null.			pIn.Value = DBNull.Value;			cmd.ExecuteNonQuery();			CheckParameter("Returning DBNull", pOut);			// The third call to the procedure returns 2.			pIn.Value = 1.5;			cmd.ExecuteNonQuery();			CheckParameter("Returning 1.5", pOut);			cn.Close();		}		static void CheckParameter(string Message, IDbDataParameter Parameter)		{			Console.WriteLine("\t{0}", Message);			Console.WriteLine("\t\tValue:{0}\tPrecision:{1}\tScale:{2}", 				(Parameter.Value != DBNull.Value) ? Parameter.Value : "DBNull", 				Parameter.Precision, Parameter.Scale);			Console.WriteLine();		}		static void PrepDb(IDbConnection Connection)		{			IDbCommand cmd = Connection.CreateCommand();			Connection.Open();			cmd.CommandText = "DROP PROCEDURE ParameterPrecisionTest";			try {cmd.ExecuteNonQuery();} 			catch {}			cmd.CommandText = "CREATE PROCEDURE ParameterPrecisionTest " +				"(@pIn decimal(19, 4), @pOut decimal(19, 4) OUTPUT) " +				"AS SET @pOut = @pIn";			cmd.ExecuteNonQuery();			Connection.Close();		}	}}
Observação neste exemplo, a segunda chamada para o procedimento armazenado define o parâmetro de saída como DBNull . Portanto, a precisão e a escala são redefinidas para (38,0) . O procedimento armazenado Arredonda o terceiro resultado e, portanto, retorna um valor igual a 2.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 892406 - Última Revisão: 01/17/2015 09:50:28 - Revisão: 2.4

Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Workgroup Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition 64-bit

  • kbnosurvey kbarchive kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtpt
Comentários