我试图调用存储过程有几个必要和几个可选参数。在我来之前,程序的开始是这样写出来的:不能调用存储过程,而无需指定理应可选参数
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',它没有提供。
我觉得这个消息有种奇怪,因为格式似乎劫持。无论如何,在引擎盖下的命令被经由被用于填充DataSet
一个SqlDataAdapter
执行。执行Fill
方法期间抛出异常。
什么是对你的ADO调用样子的代码? – RobB 2012-07-07 04:23:55
你是否也检查过异常? – 2012-07-07 04:24:32
@DeveloperJigarPandya你是什么意思的“检查”?如在,检查消息和堆栈跟踪,或者你的意思是编程的东西? – 2012-07-07 04:37:45