FIX: L'impostazione per la precisione e la scala dei dati restituiti da una stored procedure output parametro è (38,0) quando viene restituito un valore null in SQL Server 2000

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

892406
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Bug #: 473209 (SQL Server 8.0)
Sintomi
Si supponga che il seguente scenario: In Microsoft SQL Server 2000, un parametro di output di una stored procedure utilizza un tipo di dati decimale o un tipo di dati numerico. Quando viene restituito un valore null, l'impostazione per la precisione e la scala dei dati restituito dalla stored procedure di output parametro è (38,0) . Questa impostazione viene mantenuta nelle chiamate successive alla stored procedure. Questo comportamento può causare dati per essere arrotondato al valore integer.

Questo problema riguarda solo per le applicazioni che utilizzano lo spazio dei nomi System.Data.SqlClient . Questo problema non influisce sulle applicazioni che utilizzano altre API di accesso dati.

Ad esempio, è necessario che una stored procedure che dispone di un parametro di output DECIMAL(19,4) . Chiamare quindi la seguente stored procedure da un metodo SqlCommand.ExecuteNonQuery con parametri.
CREATE PROCEDURE ParameterPrecisionTest(	@pIn DECIMAL(19,4), 	@pOut DECIMAL(19,4) OUTPUT) AS	SET @pOut = @pIn
quando si esegue questa operazione, si verificano i sintomi seguenti:
  1. Quando si chiama il metodo ExecuteNonQuery e si imposta il parametro di output SqlParameter per 1,5 , viene restituito 1.5.
  2. Quando si chiama il metodo ExecuteNonQuery e si imposta il parametro di output SqlParameter su DBNull , viene restituito System.DBNull.
  3. Quando si chiama il metodo ExecuteNonQuery e impostare il parametro di output SqlParameter 1.5 , viene restituito 2.
Nota Nella seconda chiamata alla stored procedure, la precisione e la scala vengono reimpostate (38,0) . Nella terza chiamata alla stored procedure, viene restituito un valore di 2.
Cause
Questo problema si verifica perché SQL Server Reimposta la precisione e la scala per (38,0) quando sono vere le seguenti condizioni:
  • Chiamare una stored procedure che contiene un parametro di output SqlParameter .
  • Impostare il parametro su DBNull .
Risoluzione

Informazioni sul Service pack

Per risolvere il problema, ottenere il service pack più recente per Microsoft SQL Server 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
290211Come ottenere il service pack più recente per SQL Server 2000
Status
Questo problema è stato innanzitutto corretto in SQL Server 2000 Service Pack 4.
Informazioni

Procedura per riprodurre il problema

Eseguire il codice C# riportato di seguito.
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();		}	}}
Nota In questo esempio, la seconda chiamata alla stored procedure imposta il parametro output su DBNull . Di conseguenza, la precisione e la scala vengono reimpostate (38,0) . La stored procedure Arrotonda il terzo risultato e pertanto restituisce un valore di 2.

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 892406 - Ultima revisione: 01/17/2015 09:50:25 - Revisione: 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 KbMtit
Feedback