1
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#の両方で同じコードがあり、彼のPCでは問題なく動作しますが、私の場合はこのエラーがスローされます.3時間からこれを解決しようとしていますが、完全に答えがありません.これを解決し続ける.................................

繰り返しますが、問題はDBへの接続やパラメーターのタイプ、または値からではなく、エラーはパラメーター自体でコミットされます-プロシージャには存在しません。これは私の意見では正気ではありません。

4

2 に答える 2

0

すべてのパラメータはオプションであるため、クライアント コードから明示的に指定する必要はありません。デフォルト値は、SQL Server によって提供されます。コントラクトは、ストアド プロシージャの署名でそれを明示的に述べています。

オプションのパラメーターはまさにそれです: オプションです。誤った数のパラメーターを指定した場合、SQL Server は別のエラーを返し、パラメーターの数が正しくないことを示します。これはそうではありません。代わりに、未定義のパラメーターを要求していることがわかります。これは、呼び出していると思われるストアド プロシージャのシグネチャが、実際に呼び出しているストアド プロシージャのシグネチャと一致しないことを示しています。

両方が同じデータベース インスタンスに接続していることを確認します。そうでない場合は、ストアド プロシージャが両方のデータベース インスタンスで同一であることを確認します。

于 2013-10-14T18:00:57.837 に答える
0

パラメータ数が一致しません。パラメータをもう一度確認してください。

「begin」句の前に宣言しているため、rowtotal と rowsperpage のパラメーターも送信する必要があります。

そのパラメーターを送信したくない場合、それらが単なる定数である場合は、パラメーターではなく、変数または定数として以下で宣言してください。

すなわち

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

お役に立てれば。

于 2013-10-14T16:38:46.703 に答える