【发布时间】:2018-06-12 00:19:28
【问题描述】:
我有一个这样的存储过程
PROCEDURE PRC_ABCD_GETALL (resultset_out OUT TYPES.cursorType)
AS
BEGIN
OPEN
resultset_out FOR SELECT * FROM ABCD;
END PRC_ABCD_GETALL;
而且这个程序在包里,包是这样的
create or replace
PACKAGE V4_EVT_PKG_ABCD_GENERAL
AS
PROCEDURE PRC_ABCD_GETALL (resultset_out OUT TYPES.cursorType);
END V4_EVT_PKG_ABCD_GENERAL;
oracle 数据提供者是 system.data.oracleClient,之前的代码是这样的
public static IEnumerable<PortalList> GetAll()
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand objComm = db.GetStoredProcCommand("package_name.sp", new
object[1]);
var result = new List<PortalList>();
using (IDataReader rdr = db.ExecuteReader(objComm))
{
while (rdr.Read())
{
result.Add(Construct(rdr));
}
}
return result;
}
现在我发现 system.data.oracleClient 已被贬低,我想使用 Oracle.DataAccess.Client 作为数据提供者我为此编写了 C# 代码,但我遇到了一些错误,例如调用中的参数数量或类型错误到这个函数中的'PRC_ABCD_GETALL' PortalListRepository.GetAll();
private static IEnumerable<PortalList> GetAll(bool forceDataReload)
{
const string cacheKey = "PortalListService_GetAll";
IEnumerable<PortalList> result = null;
if (!forceDataReload)
result = GetFromCache(cacheKey);
if (result == null)
{
result = PortalListRepository.GetAll();
AddToCache(cacheKey, result);
}
return result;
}
我无法解决。
C#代码
public static IEnumerable<PortalList> GetAll()
{
string cnn = "connectionstring";
var result = new List<PortalList>();
using (OracleConnection conn = new OracleConnection(cnn))
{
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "PRC_ABCD_GETALL";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("resultset_out", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
OracleDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
result.Add(Construct(rdr));
}
}
return result;
}
我对此非常陌生,我不知道如何解决它。任何人都知道我在 C# 代码、我的存储过程或我的包中做错了什么?请帮助我一直在尝试这个差不多 3 周,但没有运气:(((
【问题讨论】:
-
您的代码和错误不匹配。这是真正的代码吗?
-
是的,我写了这段代码。问题是如果我关闭这个 cmd.Parameters.Add("resultset_out", OracleType.Cursor, ParameterDirection.Output);然后我得到“ORA-06550:第 1 行,第 7 列:\nPLS-00306:调用 'PRC_ABCD_GETALL'\nORA-06550:第 1 行,第 7 列:\nPL/SQL:语句被忽略” .你能帮我解决这个问题吗?我搜索了所有东西,但没有运气:( .
-
你能从sql developer正确执行你的存储过程吗?您使用光标有什么原因吗?
-
您好,感谢您的回复:)。这都是由以前的开发人员完成的。我项目中的每个存储过程都有相同的 resultset_out OUT TYPES.cursorType。我正在尝试纠正它,但我对 TYPES.cursortype 感到困惑。我从来没有使用过这个。你能告诉我在包、存储过程或 C# 代码中要纠正什么吗?我会将我的过程执行的屏幕截图附加到 sql 开发人员中以获取更多详细信息。你的回复对我来说真的很有价值。我是试图解决这个问题超过 3 周,但根本没有运气:(
标签: c# asp.net-mvc oracle11g