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

Traduzione articoli Traduzione articoli
Identificativo articolo: 892406 - Visualizza i prodotti a cui si riferisce l?articolo.
Bug #: 473209 (SQL Server 8.0)
Espandi tutto | Chiudi tutto

In questa pagina

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.

Proprietà

Identificativo articolo: 892406 - Ultima modifica: venerdì 2 novembre 2007 - Revisione: 2.4
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi: 
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtit
Traduzione automatica articoli
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.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 892406
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com