Oprava: Nastavení pro přesnost a měřítko data vrácená z uložené procedury výstupní parametr je (38,0) při SQL Server 2000 je vrácena hodnota null

Překlady článku Překlady článku
ID článku: 892406 - Produkty, které se vztahují k tomuto článku.
Chyba č: 473209 (SQL Server 8.0)
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Předpokládejme následující scénář: V Microsoft SQL Server 2000 uložené procedury výstupní parametr používá typ dat decimal nebo číselný datový typ. Při vrácena hodnota null nastavení pro přesnost a měřítko data vrácená z uložené procedury výstupní parametr je (38,0). Toto nastavení je zachována u následných volání uložené procedury. Toto chování může způsobit dat zaokrouhlené na celočíselnou hodnotu.

Tento problém se týká pouze aplikace, které používají System.data.SqlClient oboru názvů. Tento problém nemá vliv na aplikace, které používají jiné datové API.

Například máte uloženou proceduru, která má výstupní parametr DECIMAL(19,4). Potom následující uložené procedury voláním z parametrizované metody SqlCommand.ExecuteNonQuery.
CREATE PROCEDURE ParameterPrecisionTest(
	@pIn DECIMAL(19,4), 
	@pOut DECIMAL(19,4) OUTPUT) 
AS
	SET @pOut = @pIn
Když toto provedete, vyskytnout následující příznaky:
  1. Při volání metody ExecuteNonQuery a nastavit výstupní parametr SqlParameter1.5 je vrácena 1.5.
  2. Při volání metody ExecuteNonQuery a nastavit SqlParameter výstupní parametr typu DBNull System.DBNull vrácena.
  3. Při volání metody ExecuteNonQuery a nastavit výstupní parametr SqlParameter1.5 je vrácena 2.
Poznámka: V druhé volání uložené procedury je (38,0) obnovit přesnost a měřítko. Ve třetí volání uložené procedury je vrácena hodnota 2.

Příčina

K tomuto problému dochází, protože SQL Server obnoví přesnost a měřítko (38,0) když jsou splněny následující podmínky:
  • Volání uložené procedury, která obsahuje výstupní parametr SqlParameter.
  • Nastavíte parametr typu DBNull.

Řešení

Informace o aktualizaci Service Pack

Tento problém vyřešíte získat nejnovější aktualizaci service pack pro 2000 Microsoft SQL Server. Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
290211Jak získat nejnovější aktualizaci Service Pack pro SQL Server 2000

Prohlášení

Tento problém byl poprvé opraven v Microsoft SQL Server 2000 Service Pack 4.

Další informace

Postup reprodukce problému

Spustit následující kód 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();
		}

	}
}
Poznámka: V tomto příkladu, druhé volání uložené procedury nastaví výstupní parametr typu DBNull. Tedy přesnost a měřítko budou obnoveny (38,0). Zaokrouhlí třetí výsledek uloženou proceduru a proto vrátí hodnotu 2.

Vlastnosti

ID článku: 892406 - Poslední aktualizace: 2. listopadu 2007 - Revize: 2.4
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt kbbug kbtshoot kbprb kbfix KB892406 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:892406

Dejte nám zpětnou vazbu

 

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