次のシナリオを前提としています: Microsoft SQL Server で 2000年、10 進数データ型または数値型ストアド プロシージャの出力パラメーターを使用します。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
これを行うと、次の現象が発生します。
- 呼び出すと、 ExecuteNonQuery メソッドとは、 SqlParameter 出力パラメーター 1.5は 1.5 になります。
- 呼び出すと、 ExecuteNonQuery メソッドとは、 SqlParameter 出力パラメーター DBNullSystem.DBNull が返されます。
- 呼び出すと、 ExecuteNonQuery メソッドとは、 SqlParameter 出力パラメーター 1.5、2 が返されます。
メモ ストアド プロシージャの 2 番目の呼び出しで、精度とスケールにリセットされます。
(38, 0).ストアド プロシージャ、3 番目の呼び出しで値 2 が返されます。
SQL Server が、精度とスケールにリセットされるために発生します。
(38, 0) 次の条件が当てはまる場合。
- 含まれているストアド プロシージャを呼び出す、 SqlParameter 出力パラメーターです。
- パラメーターを設定するのには DBNull.
サービス パックの情報
この問題を解決するには、Microsoft SQL Server 2000年用の最新の service pack を入手します。詳細については、Knowledge Base の資料を参照するのには、次の資料番号をクリックしてください。
290211
(http://support.microsoft.com/kb/290211/
)
SQL Server 2000年の最新の service pack を入手する方法
この問題は、最初 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();
}
}
}
メモ この例では、2 番目の呼び出しは、ストアド プロシージャが出力パラメーターに設定します
DBNull.そのため、精度とスケールにリセットされます。
(38, 0).ストアド プロシージャは、3 つ目の結果を四捨五入し、したがって 2 の値を返します。
文書番号: 892406 - 最終更新日: 2011年7月18日 - リビジョン: 4.0
| kbtshoot kbbug kbfix kbprb kbmt KB892406 KbMtja |
機械翻訳の免責重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:
892406
(http://support.microsoft.com/kb/892406/en-us/
)
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。