【发布时间】:2020-09-27 13:40:00
【问题描述】:
所以我正在修改一份现有的报告。我们还需要维护旧的。所以我创建了一个存储过程,我相信 SP 工作正常。我在 PL/SQL 中对其进行了测试。以下是执行现有SP的代码
public static DataSet getReportDataAssetQualityCrisil(string pSPName, int v_UID, string v_FromDt, string v_ToDt, int v_round, string Flag,
string v_Gilt, string RequestSessionID, string ReportName)
{
string strErrMsg = "";
try
{
DataSet objInvDataSet = null;
Database db = DatabaseFactory.CreateDatabase("MutualFund");
objInvDataSet = new DataSet();
DbCommand dbCmd = db.GetStoredProcCommand(pSPName);
dbCmd.CommandType = CommandType.StoredProcedure;
db.DiscoverParameters(dbCmd);
db.SetParameterValue(dbCmd, "v_UID", v_UID);
db.SetParameterValue(dbCmd, "v_FromDt", v_FromDt);
db.SetParameterValue(dbCmd, "v_ToDt", v_ToDt);
db.SetParameterValue(dbCmd, "v_round", v_round);
db.SetParameterValue(dbCmd, "v_Flag", Flag.ToUpper().ToString());
db.SetParameterValue(dbCmd, "v_Gilt", v_Gilt);
db.SetParameterValue(dbCmd, "V_REQUESTSESSIONID", RequestSessionID);
db.SetParameterValue(dbCmd, "v_REPORTTYPE", ReportName);
db.SetParameterValue(dbCmd, "resultset_out", null);
objInvDataSet = db.ExecuteDataSet(dbCmd);
return objInvDataSet;
}
catch (Exception ex)
{
strErrMsg = ex.Source;
strErrMsg = ex.Message;
strErrMsg = ex.StackTrace;
return null;
}
}
The new report has fewer parameters. Following is the code for the new procedure that I created.
public static DataSet getReportDataAssetQualityCrisilRevised(string pSPName, string V_FROMDT, string V_TODT, int V_UID, string RequestSessionID)
{
string strErrMsg = "";
try
{
DataSet objInvDataSet = null;
Database db = DatabaseFactory.CreateDatabase("MutualFund");
objInvDataSet = new DataSet();
DbCommand dbCmd = db.GetStoredProcCommand(pSPName);
dbCmd.CommandType = CommandType.StoredProcedure;
db.DiscoverParameters(dbCmd);
db.SetParameterValue(dbCmd, "V_FROMDT", V_FROMDT);
db.SetParameterValue(dbCmd, "V_TODT", V_TODT);
db.SetParameterValue(dbCmd, "V_UID", V_UID);
db.SetParameterValue(dbCmd, "RESULTSET_OUT", null);
db.SetParameterValue(dbCmd, "V_REQUESTSESSIONID", RequestSessionID);
objInvDataSet = db.ExecuteDataSet(dbCmd);
return objInvDataSet;
}
catch (Exception ex)
{
strErrMsg = ex.Source;
strErrMsg = ex.Message;
strErrMsg = ex.StackTrace;
return null;
}
}
但是,当执行控制超过 db.setParameterValue 时,我收到一个异常,提示“此 OracleParameterCollection 不包含带有 ParameterName 'V_FROMDT' 的 OracleParameter。”
这两个函数在同一个类中。
【问题讨论】:
-
SetParameterValue是否也将参数添加到命令中,还是只是像名称所暗示的那样设置值?另外,参数名称是否区分大小写? -
老实说,我不知道。我发现了一件事。如果我将程序的名称更改为上面已经存在的名称,系统就能够选择参数,这告诉我某处存在某种映射。我在整个解决方案中搜索了现有 SP 的名称,但在其他任何地方都找不到,
-
@Crowcoder,现在我已经使用了一段时间的 oracle,C# 中的 oracle 参数名称不区分大小写。
-
@Crowcoder 另外,discover参数方法实际上是连接数据库中的SP获取参数个数。我的 Oracle SP 中存在编译时错误,这就是我遇到此问题的原因。由于我有 MS SQL 背景,我从来不知道 oracle 保存带有编译错误的 SP,因为 MS SQL 不允许这样做。