2012-07-07 32 views
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',它没有提供。

我觉得这个消息有种奇怪,因为格式似乎劫持。无论如何,在引擎盖下的命令被经由被用于填充DataSet一个SqlDataAdapter执行。执行Fill方法期间抛出异常。

+0

什么是对你的ADO调用样子的代码? – RobB 2012-07-07 04:23:55

+0

你是否也检查过异常? – 2012-07-07 04:24:32

+0

@DeveloperJigarPandya你是什么意思的“检查”?如在,检查消息和堆栈跟踪,或者你的意思是编程的东西? – 2012-07-07 04:37:45

回答

0

在此http://msdn.microsoft.com/en-us/library/ms187926.aspx链路下面的行中提到..

每个声明参数的值必须由用户来提供时,除非该参数的缺省值被定义在调用该过程或值是设置为等于另一个参数。如果过程包含表值参数,该参数在呼叫丢失,空表中通过。因此,基于我可以说

,如果你把“默认”的重点工作中的问题将得到解决。

同样在默认情况下就在同一页的信息是一个像下面详细提及。

默认 参数的默认值。如果为参数定义了默认值,则可以执行该过程而不指定该参数的值。默认值必须是常量或可以是NULL。常数值可以采用通配符的形式,这样在将参数传递给过程时可以使用LIKE关键字。见下面的例子C.

的默认值被记录在sys.parameters.default列仅 CLR过程。对于Transact-SQL 过程参数,该列将为NULL。

感谢, Jigar

相关问题