更新时发生错误.. System.Data.SqlClient.SqlException:过程或函数指定了太多参数

时间:2015-01-28 06:15:23

标签: sql-server stored-procedures service arguments

在我的项目中,我试图将XML口袋从一个表解析为多个表,使用这些表我将在前端UI中显示值。启动Windows服务后,XML口袋已从一个表解析为多个表,但其中一个存储过程失败。在日志文件中,我收到此消息"更新Ivr呼叫数据的状态时出错 System.Data.SqlClient.SqlException:过程或函数 PROC_UPDATE_IVR_CALLDATA_STATUS 指定了太多参数。"

我的存储过程 PROC_UPDATE_IVR_CALLDATA_STATUS

ALTER PROCEDURE [dbo].[PROC_UPDATE_IVR_CALLDATA_STATUS]
(
    @i_CallID               VARCHAR(50),    
    @i_AppID        VARCHAR(24),    
    @i_CallData             XML,
    @i_Status               CHAR(1),
    @i_ProcessStatus        VARCHAR(25),    
    @o_ErrorCode            int OUTPUT,
    @o_ErrorDescription     VARCHAR(200) OUTPUT
)
AS
BEGIN
    BEGIN TRY
        SET @o_ErrorCode=0
        SET @o_ErrorDescription='SUCCESS'

        IF Exists(SELECT CallID from TBL_CALLDATA_MASTER_BACKUP D               
                  Where D.CallID = @i_CallID 
                 )
        BEGIN         
                  UPDATE TBL_CALLDATA_MASTER_BACKUP
                  SET   [Status] = @i_Status,
                  ProcessStatus = @i_ProcessStatus 
                  Where CallID = @i_CallID 

        END 
        ELSE
        BEGIN

        INSERT INTO TBL_CALLDATA_MASTER_BACKUP( CallID,ApplicationID,  CallData,[Status], ProcessStatus)
        VALUES ( @i_CallID,@i_AppID,  @i_CallData, @i_Status,
            @i_ProcessStatus );
        END       

    END TRY
    BEGIN CATCH     
        SET @o_ErrorCode=ERROR_NUMBER()
        SET @o_ErrorDescription=ERROR_MESSAGE()
    END CATCH
END

方法I在服务中使用是:

public void UpdateCallDataStatus(Hashtable htCallDataStatusInfo)
        {
            int errorCode = 0;
            string errorDesc = string.Empty;

            object[] outParamList = new object[0];
            SqlDatabase sqlDb = new SqlDatabase(_connStr);
            List<SqlParameter> paramList = new List<SqlParameter>();

            paramList.Add(sqlDb.CreateParameter("@i_CallID", SqlDbType.VarChar, 200, ParameterDirection.Input, htCallDataStatusInfo["CALL_ID"]));
            paramList.Add(sqlDb.CreateParameter("@i_SessionID", SqlDbType.VarChar, 200, ParameterDirection.Input, htCallDataStatusInfo["SESSION_ID"]));
            paramList.Add(sqlDb.CreateParameter("@i_ApplicationID", SqlDbType.VarChar, 10, ParameterDirection.Input, htCallDataStatusInfo["APP_ID"]));
            paramList.Add(sqlDb.CreateParameter("@i_CallDateTime", SqlDbType.DateTime, 50, ParameterDirection.Input, htCallDataStatusInfo["CALL_START_TIME"]));
            paramList.Add(sqlDb.CreateParameter("@i_CallData", SqlDbType.Xml, 500000, ParameterDirection.Input, htCallDataStatusInfo["CALL_DATA"]));
            paramList.Add(sqlDb.CreateParameter("@i_Status", SqlDbType.Char, 1, ParameterDirection.Input, htCallDataStatusInfo["STATUS"]));
            paramList.Add(sqlDb.CreateParameter("@i_ProcessStatus", SqlDbType.VarChar, 25, ParameterDirection.Input, htCallDataStatusInfo["PROCESS_STATUS"]));
            paramList.Add(sqlDb.CreateParameter("@i_ProcessFailureReason", SqlDbType.VarChar, 1000, ParameterDirection.Input, htCallDataStatusInfo["FAILURE_REASON"]));
            paramList.Add(sqlDb.CreateParameter("@o_ErrorCode", SqlDbType.Int, ParameterDirection.Output));
            paramList.Add(sqlDb.CreateParameter("@o_ErrorDescription", SqlDbType.VarChar, 200, ParameterDirection.Output));

            sqlDb.ExecuteNonQuery("PROC_UPDATE_IVR_CALLDATA_STATUS", CommandType.StoredProcedure, paramList, out outParamList);
            errorCode = Convert.ToInt32(Convert.ToString(outParamList[0]));
            errorDesc = Convert.ToString(outParamList[1]);

            this.Response.ErrorCode = errorCode;
            this.Response.ErrorDescription = errorDesc;
        }

我不知道如何解决这个问题。如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

因为您将10个参数作为命令传递,并且只在存储过程中定义了

ALTER PROCEDURE [dbo].[PROC_UPDATE_IVR_CALLDATA_STATUS]
(
    @i_CallID               VARCHAR(50), 
    @i_AppID        VARCHAR(24), 
    @i_CallData             XML,
    @i_Status               CHAR(1),
    @i_ProcessStatus        VARCHAR(25), 
    @o_ErrorCode            INT OUTPUT,
    @o_ErrorDescription     VARCHAR(200) OUTPUT
)

定义由sql cmd传递的存储过程中的所有输出参数

喜欢

ALTER PROCEDURE [dbo].[PROC_UPDATE_IVR_CALLDATA_STATUS]
(
    @i_CallID               VARCHAR(50), 
    @i_ApplicationID        VARCHAR(24), 
    @i_CallData             XML,
    @i_Status               CHAR(1),
    @i_ProcessStatus        VARCHAR(25), 
    @o_ErrorCode            INT OUTPUT,
    @o_ErrorDescription     VARCHAR(200) OUTPUT,
    @i_SessionID            VARCHAR(200),
    @i_CallDateTime         DATETIME,
    @i_ProcessFailureReason VARCHAR(1000)            
)