Исправление: Значение для точности и масштаба данных, возвращаемых хранимой процедурой вывода параметров (38,0), если значение null возвращается в SQL Server 2000

Переводы статьи Переводы статьи
Код статьи: 892406 - Vizualiza?i produsele pentru care se aplic? acest articol.
Ошибка #: 473209 (SQL Server 8.0)
Развернуть все | Свернуть все

В этой статье

Проблема

Предположим следующий сценарий: В Microsoft SQL Server 2000, выходного параметра хранимой процедуры используется тип данных decimal или числового типа данных. Если возвращается значение 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.51.5 возвращается.
  2. При вызове методаExecuteNonQueryметод и наборSqlParameterвыходной параметр, чтобыЗначение DBNullВозвращается System.DBNull.
  3. При вызове методаExecuteNonQueryметод и наборSqlParameterвыходной параметр, чтобы1.52 то будет возвращено.
Примечание.Во втором вызове хранимой процедуры точность и масштаб сбрасываются в(38,0). Значение 2 возвращается в третий вызов хранимой процедуры.

Причина

Данная проблема возникает из SQL Server устанавливает точность и масштаб на(38,0)Если выполняются следующие условия:
  • Вызывается хранимая процедура, которая содержитSqlParameterвыходной параметр.
  • Значение параметраЗначение DBNull.

Решение

Сведения о пакете обновления

Чтобы решить эту проблему, получите последний пакет обновления для Microsoft SQL Server 2000. Для получения дополнительных сведений обратитесь к следующей статье Базы Знаний Майкрософт::
290211Как получить последний пакет обновления для SQL Server 2000

Статус

Впервые эта проблема была исправлена в SQL Server 2000 с пакетом обновления 4.

Дополнительная информация

Действия по воспроизведению проблемы

Выполните следующий код 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 - Последний отзыв: 26 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • 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
Ключевые слова: 
kbbug kbtshoot kbprb kbfix kbmt KB892406 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:892406

Отправить отзыв

 

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