更新时出错.. System.Data.SqlClient.SqlException: 过程或函数指定的参数太多
Error occured while updating.. System.Data.SqlClient.SqlException: Procedure or function has too many arguments specified
在我的项目中,我试图将 XML 个口袋从一个 table 解析为多个 tables,使用这些 tables 我将在前端 UI。启动 Windows 服务后,XML 口袋已从一个 table 解析为多个 table,但其中一个存储过程失败。在日志文件中,我收到此消息 “更新 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)
)
在我的项目中,我试图将 XML 个口袋从一个 table 解析为多个 tables,使用这些 tables 我将在前端 UI。启动 Windows 服务后,XML 口袋已从一个 table 解析为多个 table,但其中一个存储过程失败。在日志文件中,我收到此消息 “更新 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)
)