FIX: 精確度和預存程序傳回資料的小數位數的設定輸出參數是 (38,0) 時在 SQL Server 2000 中,便會傳回 null 值

文章翻譯 文章翻譯
文章編號: 892406 - 檢視此文章適用的產品。
Bug #: 473209 (SQL Server 8.0)
全部展開 | 全部摺疊

在此頁中

徵狀

假設下列案例: 在 Microsoft SQL Server 2000,預存程序輸出參數會使用十進位資料型別或數值資料型別。傳回 Null 值時的精確度和預存程序傳回資料的小數位數設定輸出參數是 (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

解決方案

服務套件資訊

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2000。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
290211如何取得最新的 SQL Server 2000 Service Pack

狀況說明

這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 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 - 上次校閱: 2007年11月2日 - 版次: 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
關鍵字:?
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:892406
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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