Düzeltme:, Kesinlik ve ölçek, bir saklı yordamdan dönen veri ayarı (38,0 oluyor SQL Server 2000'de bir boş değer döndürüldüğünde) parametresi olan çıkış

Makale çevirileri Makale çevirileri
Makale numarası: 892406 - Bu makalenin geçerli olduğu ürünleri görün.
# Hata: 473209 (SQL Server 8.0)
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Aşağıdaki senaryoda varsayalım: ondalık veri türü veya bir sayısal veri türü, Microsoft SQL Server 2000 içinde bir saklı yordam çıkış parametresi kullanır. Boş değer döndürüldüğünde kesinlik ve ölçek, bir saklı yordamdan dönen veri ayarı (38,0 oluyor) parametresi olan çıkış. Bu ayar, sonraki aramalarda saklı yordama korunur. Bu davranış, bir tamsayı yuvarlanmasını veri neden olabilir.

Bu sorun, yalnızca System.Data.SqlClient ad kullanan uygulamalar için geçerlidir. Bu sorun, diğer veri erişim Apı'leri kullanan uygulamaları etkilemez.

Örneğin, bir DECIMAL(19,4) çıktı parametresi olan bir saklı yordam vardır. Sonra saklı yordamını parametreli hale getirilmiş bir SqlCommand.ExecuteNonQuery yöntemini çağırın.
CREATE PROCEDURE ParameterPrecisionTest(
	@pIn DECIMAL(19,4), 
	@pOut DECIMAL(19,4) OUTPUT) 
AS
	SET @pOut = @pIn
Bunu yaptığınızda aşağıdaki belirtilerle karşılaşırsınız:
  1. ExecuteNonQuery yöntemini çağırmak için 1.5SqlParameter çıkış parametresi ayarlanmış, 1.5 döndürülür.
  2. ExecuteNonQuery yöntemini çağırmak için DBNullSqlParameter çıkış parametresi ayarlanmış, System.DBNull döndürülür.
  3. ExecuteNonQuery yöntemini çağırmak için 1.5SqlParameter çıkış parametresi ayarlanmış, 2 döndürülür.
Not Saklı yordam için ikinci çağrı kesinlik ve ölçek (38,0 oluyor) için sıfırlanır. 2 Değeri, üçüncü saklı yordam çağrısında döndürdü.

Neden

Bu sorun, aşağıdaki koşullar geçerli olduğunda SQL Server kesinlik ve ölçek (38,0 oluyor) için sıfırlar oluşur:
  • SqlParameter bir çıkış parametresi içeren bir saklı yordam çağrısı.
  • Parametre, DBNull için ayarlayın.

Çözüm

Hizmet paketi bilgileri

Bu sorunu gidermek için <a0></a0>, Microsoft SQL Server 2000 için en son hizmet paketini edinin. Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
290211En son SQL Server 2000 hizmet paketi nasıl elde edilir

Durum

Bu sorun ilk olarak Microsoft SQL Server 2000 Service Pack 4'te giderilmiştir.

Daha fazla bilgi

Sorunu Yeniden Oluşturma Adımları

Aşağıdaki Visual C# kodu çalıştırın.
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();
		}

	}
}
Not bu örnekte, ikinci saklı yordam çağrısına çıkış parametresi DBNull için ayarlar. Bu nedenle, kesinlik ve ölçek (38,0 oluyor) için sıfırlanır. Saklı yordamın sonuç üçüncü yuvarlar ve bu nedenle, 2 değeri döndürür.

Özellikler

Makale numarası: 892406 - Last Review: 2 Kasım 2007 Cuma - Gözden geçirme: 2.4
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:892406

Geri Bildirim Ver

 

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