いくつかの必須パラメーターといくつかのオプションパラメーターを使用してストアドプロシージャを呼び出そうとしています。私が来る前に、手順の最初は次のようにスクリプト化されていました。
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
メソッドの実行中に例外がスローされます。