FIX: (38,0) عندما يتم إرجاع قيمة خالية في SQL Server 2000 هو معلمة إخراج الإعداد الدقة أو المقياس البيانات التي يتم إرجاعها من إجراء مخزن

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية892406
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الخطأ رقم: 473209 (SQL Server 8.0)
الأعراض
تفترض السيناريو التالي: في Microsoft SQL Server 2000 ، يستخدم معلمة إخراج إجراء مخزن نوع بيانات عشري أو نوع بيانات رقمية. عند إرجاع قيمة خالية إخراج إعداد الدقة أو المقياس البيانات التي يتم إرجاعها من الإجراء المخزن معلمة (38,0). يتم الاحتفاظ هذا الإعداد على المكالمات اللاحقة إلى الإجراء المخزن. قد يؤدي هذا السلوك البيانات سيتم تقريبه إلى قيمة عدد صحيح.

يتم تطبيق هذه المشكلة فقط على التطبيقات التي تستخدم مساحة الاسم System.Data.SqlClient. لا تؤثر هذه المشكلة على التطبيقات التي تستخدم الأخرى الوصول إلى البيانات API.

على سبيل المثال، لديك إجراء مخزن يحتوي على معلمة إخراج DECIMAL(19,4). ثم يتم استدعاء الإجراء المخزن التالية من أسلوب SqlCommand.ExecuteNonQuery ذات معلمات.
CREATE PROCEDURE ParameterPrecisionTest(	@pIn DECIMAL(19,4), 	@pOut DECIMAL(19,4) OUTPUT) AS	SET @pOut = @pIn
عند القيام بذلك، تواجه الأعراض التالية:
  1. عند استدعاء الأسلوب ExecuteNonQuery وتعيين معلمة الإخراج SqlParameter إلى 1.5 يتم إرجاع 1.5.
  2. عند استدعاء الأسلوب ExecuteNonQuery وتعيين معلمة الإخراج SqlParameter إلى DBNull يتم إرجاع System.DBNull.
  3. عند استدعاء الأسلوب ExecuteNonQuery وتعيين معلمة الإخراج SqlParameter إلى 1.5 يتم إرجاع 2.
ملاحظة في استدعاء آخر إلى الإجراء المخزن الدقة "و" المقياس يتم إعادة تعيين إلى (38,0). يتم إرجاع قيمة 2 في استدعاء الثالث إلى الإجراء المخزن.
السبب
تحدث هذه المشكلة نظرًا لأن SQL Server التعيين الدقة "و" المقياس إلى (38,0) عند الشروط التالية:
  • استدعاء إجراء مخزن الذي يحتوي على معلمة إخراج SqlParameter.
  • تعيين المعلمة إلى DBNull.
الحل

معلومات حزمة الخدمة

لحل هذه المشكلة، يجب الحصول على أحدث حزمة خدمة لـ Microsoft SQL Server 2000. لمزيد من المعلومات، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
290211كيفية الحصول على أحدث حزمة خدمة لـ SQL Server 2000
تصريح
تم تصحيح هذه المشكلة لأول مرة في Microsoft SQL Server 2000 المزود بحزمة الخدمة Service Pack 4.
معلومات أخرى

خطوات إعادة إنشاء المشكلة

تشغيل برمجية Visual C# التالية.
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();		}	}}
ملاحظة في هذا المثال استدعاء آخر إلى الإجراء المخزن تعيين معلمة الإخراج إلى DBNull. لذلك، يتم إعادة تعيين الدقة "و" المقياس إلى (38,0). الإجراء المخزن تقريب النتائج الثالث وإرجاع وبالتالي قيمة 2.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 892406 - آخر مراجعة: 01/17/2015 09:50:21 - المراجعة: 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 KbMtar
تعليقات