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

C# 参数不作为存储过程参数存在,c#,sql,sql-server,visual-studio,stored-procedures,C#,Sql,Sql Server,Visual Studio,Stored Procedures,这是程序的开始 ALTER PROCEDURE [dbo].[SelectCompletionNonCompletionCourseReport] @LearnerName NVARCHAR(510) = NULL, @ManagerId INT = NULL, @CourseId INT = NULL, @StartDateFrom SMALLD

这是程序的开始

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               
这是与过程通信的方法,它给了我一个错误

参数不作为存储过程存在参数/函数/过程接受太多参数

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

记录在案,这个问题今天确实出现了,没有任何代码编写/修改,只是在我试图做报告的时候出现了,昨天一切都很好……我有一个队友在我旁边,在sql和c#中使用了完全相同的代码,在他的pc上工作得很好,但我的队友抛出了这个错误,我试图在3小时内解决这个问题,我完全没有答案,所以请告诉我应该继续解决这个问题的方向


我再说一遍,问题不在于与DB的连接、参数类型或值,错误是由参数本身造成的——在过程中不存在,这在我看来是疯狂的。

参数计数不匹配。再次检查参数

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

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

i、 e


希望这能有所帮助。

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

可选参数正好是:optional。如果提供的参数数量不正确,SQL Server将返回另一个错误,表明参数数量不正确。事实并非如此。相反,您看到您正在请求一个未定义的参数,这表明您认为正在调用的存储过程签名与您实际调用的存储过程签名不匹配


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

您没有在C代码中为
@RowsTotal
@RowsPerPage
定义任何值……FREEFALLER-不,在这个存储过程中没有调用其他存储过程。marc_s--好的,我也会添加它们,但正如我所说的,绝对相同的代码在我旁边运行良好…你确定你的应用程序正在连接到数据库的完全相同的副本吗?如果您的任何连接字符串具有选项
User Instance
AttachDbFileName
,则很可能它们没有指向您认为它们是的同一副本。marc\u s这是相同的。bla bla存储过程接受太多参数(PageIndex;),但所有参数都是可选的;我认为这不是问题。这不是问题;)这是应该做的,但是对于这个特定的错误,它没有帮助。所有内容都经过验证,如果我对{cmd.Parameters.AddWithValue(“@PageIndex”,1);}进行注释,它将返回一页上的所有行,但是由于可能有15k行的报告,我需要PageIndex。我不知道我还能给你什么信息,这样你就可以对这个问题有更大的看法/出于好奇,如果您提供@RowsCount作为参数,值为零,会发生什么情况?我尝试添加所有参数-13它给了我一个错误:过程或函数SelectCompletionNonCompletionCourseReport指定的参数太多。之后,我分别尝试了最后3个参数中的每一个,也得到了这个错误。当我在添加参数阶段对该行添加了“@ReportListTeam”并在其后面添加了PageIndex时,它表示@PageIndex不是此过程的参数。我没有任何其他同名过程,甚至与之相近的过程。我用schema_参数检查了参数,也用sqlprofiler检查了参数
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;
        }
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