在我的项目中,我试图将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;
}
我不知道如何解决这个问题。如果您需要更多详细信息,请与我们联系。
答案 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)
)