0

いくつかの必須パラメーターといくつかのオプションパラメーターを使用してストアドプロシージャを呼び出そうとしています。私が来る前に、手順の最初は次のようにスクリプト化されていました。

USE [MYDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_GetStudents]
(
    @SortOrder          varchar(50),
    @SortColumn         varchar(150),
    @SortLetter         varchar(10),
    @Status             varchar(250),
    @PageIndex              int,
    @PageSize           int,
    @User_ID            int,
    @Reference_No           varchar(50) = NULL,
    @First_Name         varchar(50) = NULL,
    @Middle_Name            varchar(50) = NULL,
    @Last_Name          varchar(50) = NULL
)
As
BEGIN
-- other stuff here

すべてが正常に機能しているようです。次に、最後に別のパラメーターを追加しました。

USE [MYDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_GetStudents]
(
    @SortOrder          varchar(50),
    @SortColumn         varchar(150),
    @SortLetter         varchar(10),
    @Status             varchar(250),
    @PageIndex              int,
    @PageSize           int,
    @User_ID            int,
    @Reference_No           varchar(50) = NULL,
    @First_Name         varchar(50) = NULL,
    @Middle_Name            varchar(50) = NULL,
    @Last_Name          varchar(50) = NULL,
    @ContextID          int = NULL
)
As
BEGIN
-- other stuff here

そして今、それは壊れています。ADO.NETを使用して、パラメーターを使用してコマンドオブジェクトを設定することにより、ストアドプロシージャを呼び出すと、パラメーターを設定していないため、例外がスローされ@ContextIDます。

なぜですか?NULLデフォルト値のに設定すると、事実上完全にオプションになると思いました。

更新:ここでSqlCommandを設定する方法は次のとおりです。ここで表現できるのは、次のとおりです。

SqlCommand cmd = new SqlCommand("SP_GetStudents");
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter();
param.ParameterName = "@SortOrder";
param.Value = sortOrder;
param.Direction = ParameterDirection.Input;

SqlParameter param2 = new SqlParameter();
param2.ParameterName = "@SortColumn";
param2.Value = sortColumn;
param2.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);
cmd.Parameters.Add(param2);
cmd.Parameters.Add(new SqlParameter("@SortLetter", sortLetter));
cmd.Parameters.Add(new SqlParameter("@Status", status));
cmd.Parameters.Add(new SqlParameter("@PageIndex", pageIndex));
cmd.Parameters.Add(new SqlParameter("@PageSize", pageSize));

// here, the code splits a search expression into multiple parameters, looping over a switch statement like this:

foreach (string token in tokens)
{
    switch(token)
    {
        case "Reference_No":
            cmd.Parameters.Add(new SqlParameter("@Reference_No", (object)value ?? DBNull.Value));
            break;
        case "First_Name":
            cmd.Parameters.Add(new SqlParameter("@First_Name", (object)value ?? DBNull.Value));
            break;
        case "Last_Name":
            cmd.Parameters.Add(new SqlParameter("@Last_Name", (object)value ?? DBNull.Value));
            break;
        case "Middle_Name":
            cmd.Parameters.Add(new SqlParameter("@Middle_Name", (object)value ?? DBNull.Value));
            break;
        case "Generation":
            cmd.Parameters.Add(new SqlParameter("@Generation", (object)value ?? DBNull.Value));
            break;
        case "ContextID":
            cmd.Parameters.Add(new SqlParameter("@ContextID", (object)value ?? DBNull.Value));
            break;
    }
}

cmd.Parameters.AddWithValue("@User_ID", userID);
// fires off cmd through a DAL

System.Data.SqlClient.SqlException(タイプの)例外は次のとおりです。

パラメータ化されたクエリ'(@Reference_No varchar(50)、@First_Name varchar(5'は、指定されていないパラメータ'@ContextID'を予期します。

フォーマットがぎこちないように見えるので、このメッセージはちょっと奇妙だと思います。とにかく、内部では、コマンドは、SqlDataAdapterを埋めるために使用されるを介して実行されDataSetます。Fillメソッドの実行中に例外がスローされます。

4

1 に答える 1

0

このhttp://msdn.microsoft.com/en-us/library/ms187926.aspxリンクには、次の行が記載されています..

宣言された各パラメーターの値は、パラメーターのデフォルト値が定義されていないか、値が別のパラメーターと等しくなるように設定されていない限り、プロシージャーが呼び出されるときにユーザーが指定する必要があります。プロシージャにテーブル値パラメーターが含まれていて、そのパラメーターが呼び出しで欠落している場合、空のテーブルが渡されます。

それに基づいて、「デフォルト」キーを使用すると問題は解決すると言えます。

また、デフォルトに関する同じページの情報には、次のような詳細が記載されています。

default パラメータのデフォルト値。パラメータにデフォルト値が定義されている場合、そのパラメータの値を指定せずにプロシージャを実行できます。デフォルト値は定数である必要があり、NULL にすることもできます。定数値はワイルドカードの形式にすることができるため、パラメーターをプロシージャーに渡すときに LIKE キーワードを使用できます。以下の例 C を参照してください。

デフォルト値は、CLR プロシージャの場合にのみ sys.parameters.default 列に記録されます。Transact-SQL プロシージャ パラメータの場合、その列は NULL になります。

ありがとう、ジガー

于 2012-07-07T04:47:32.583 に答える