Entrar

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.

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