sql-server - 更新时发生错误..System.Data.SqlClient.SqlException : Procedure or function has too many arguments specified

标签 sql-server stored-procedures service arguments

在我的项目中,我尝试将 XML pockets 从一个表解析为多个表,使用这些表我将在前端 UI 中显示值。启动 Windows 服务后,XML pocket 已从一张表解析为多个表,但其中一个存储过程失败。在日志文件中,我收到此消息“更新 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

我在服务中使用的方法是:

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;
        }

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

最佳答案

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

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)            
)

关于sql-server - 更新时发生错误..System.Data.SqlClient.SqlException : Procedure or function has too many arguments specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185859/

相关文章:

java - 在EJB模块中的Restful服务中创建Session

sql - 如何序列化(以逗号分隔的列表)SQL 行

sql-server - “There can only be one IDENTITY column per table”-为什么?

c# - 触发器返回一个结果集和/或在 SET NOCOUNT OFF 的情况下运行,而另一个未完成的结果集处于事件状态

java - JAR 文件未从 MSSQL 存储过程运行?

mysql 限制无法针对 1 个 id 执行多条记录

php - Symfony token 在订阅者中为空

SQL Server "ORDER BY"优化 - 性能大幅下降

sql - TSQL 实现双重检查锁定

android - API 级别 24 中的前台服务 - Android 7.0 Nougat