参数不作为存储过程参数存在

时间:2013-10-14 16:30:29

标签: c# sql sql-server visual-studio stored-procedures

ALTER PROCEDURE [dbo].[SelectCompletionNonCompletionCourseReport]              
  @LearnerName   NVARCHAR(510) = NULL,              
  @ManagerId     INT = NULL,              
  @CourseId      INT = NULL,              
  @StartDateFrom SMALLDATETIME = NULL,              
  @StartDateTo   SMALLDATETIME = NULL,              
  @TeamList      XML = NULL,              
  @JobID         NVARCHAR(max)=NULL,              
  @CourseStatus  NVARCHAR(20)=NULL,      
  @ReportAdminID INT=0,      
  @ReportTeamList   NVARCHAR(max)=NULL,
  @RowsTotal int  = 0,
  @PageIndex int = 1,
  @RowsPerPage int = 10      
AS              
BEGIN              

  DECLARE @TblCrieiria TABLE              
    (              
       id         INT IDENTITY(1, 1),              
       areacode   NVARCHAR(11),              
       regioncode NVARCHAR(11),              
       teamcode   NVARCHAR(11)              
    )              
    IF @TeamList IS NULL              
    BEGIN              
    INSERT INTO @TblCrieiria VALUES(NULL,NULL,NULL)              
    END              

   BEGIN               

这是程序的开始......

using (Database db = new Database(DScape.DAL.Config.ConfignPropertyName.DSCAPELMS_CONNECTION_STRING_NAME))
{
            var cmd = new SqlCommand
            {
                CommandText = "SelectCompletionNonCompletionCourseReport",
                CommandType = CommandType.StoredProcedure
            };

                cmd.Parameters.AddWithValue("@LearnerName", LearnerName);
                cmd.Parameters.AddWithValue("@ManagerId", ManagerId);
                cmd.Parameters.AddWithValue("@CourseId", CourseId);
                cmd.Parameters.AddWithValue("@StartDateFrom", StartDateFrom);
                cmd.Parameters.AddWithValue("@StartDateTo", StartDateTo);
                cmd.Parameters.AddWithValue("@TeamList", TeamList);
                cmd.Parameters.AddWithValue("@JobID", JobID);
                cmd.Parameters.AddWithValue("@CourseStatus", CourseStatus);
                cmd.Parameters.AddWithValue("@ReportAdminID", ReportAdminID);
                cmd.Parameters.AddWithValue("@ReportTeamList", ReportTeamList);
                cmd.Parameters.AddWithValue("@PageIndex", 1);

                DataSet dsClient = db.GetDataSet(cmd);
                if (dsClient.Tables.Count > 0)
                    return dsClient.Tables[0];
                else
                    return null;
        }

这是与程序通信的方法,它给我一个错误

  

参数不存在,因为存储过程参数/函数/过程需要太多参数......

这是关于@PageIndex参数。无论值是什么,我们不在这里讨论值,而是在存储过程中定义但不起作用的参数?

并且为了记录,这个问题确实弹出了今天没有任何代码编写/修改刚刚出现,因为我试图做那个报告,当昨天一切都很好...我有一个队友,旁边是我在sql和c#中使用绝对相同的代码并且它在他的电脑上工作得很好,但是我发现了这个错误,我试图从3个小时解决这个问题而且我完全没有答案,所以请指教我我应该继续解决这个问题.....................

我再说一遍,问题不在于连接到DB或参数的类型或值,错误是用参数本身提交的 - 程序中不存在,这在我看来是疯了。 / p>

2 个答案:

答案 0 :(得分:0)

参数计数不匹配。再次查看params。

你必须发送rowstotal和rowsperpage的参数,因为你已经在“begin”子句之前的顶部声明了它们。

如果您不想发送该参数并且它们只是常量,请在下面将它们声明为变量或常量,而不是参数。

CREATE PROCEDURE DeleteById
@TableName sysname, 
@Id int
AS
BEGIN
DECLARE @StrId AS VARCHAR(50)

SET @StrId = CONVERT(VARCHAR(50), @Id)

--any sp code here
END

希望这有帮助。

答案 1 :(得分:0)

鉴于所有参数都是可选的,您不需要从客户端代码中明确提供任何。 SQL Server将为您提供默认值。合同在存储过程的签名中明确说明了它。

可选参数恰好是:可选。如果您提供的参数数量不正确,SQL Server将返回不同的错误,表明参数的数量不正确。不是这种情况。相反,您看到要求的参数是 undefined,,表示您正在调用的认为的存储过程签名与存储过程签名不匹配是实际来电。

确认您两者连接到同一个数据库实例。如果不是,请验证两个数据库实例上的存储过程是否相同。

相关问题