gpt4 book ai didi

c# - Oracle 存储过程适用于 ADO.NET,但使用 OrmLite 会引发异常?

转载 作者:行者123 更新时间:2023-12-02 00:34:04 27 4
gpt4 key购买 nike

我有以下存储过程:

create or replace PROCEDURE PRODUCT_DETAILS(p_code IN VARCHAR2, 
cursorParam OUT SYS_REFCURSOR)
IS
BEGIN
OPEN cursorParam FOR
select str_auth_code, str_name
from strs
where str_auth_code = p_code;
END;

如何使用 OrmLite 调用它?我尝试过:

connection.SqlList<Product>(@"EXEC PRODUCT_DETAILS @p_code", new { p_code = code });

但它抛出异常ORA-01036:非法变量名称/编号

我只是尝试使用普通的旧 ADO.NET 来实现它,它起作用了:

using (var conn = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "PRODUCT_DETAILS";
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("p_code", OracleType.NVarChar).Value = redemptionCode;
cmd.Parameters.Add("cursorParam", OracleType.Cursor);
cmd.Parameters["cursorParam"].Direction = ParameterDirection.Output;

conn.Open();
OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
Console.WriteLine(dr["Name"]);

}
conn.Close();
}

但我不知道如何使用 OrmLite 完成相同的任务。

最佳答案

你的东西看起来不错。如果您担心代码的冗长性,并且使用了许多存储过程,那么您可以使用此扩展方法来删除一些重复的代码:

扩展方法:

public static class StoredProcExtensions
{
public static List<T> ExecStoredProcedure<T>(this IDbConnection connection, string procedureName, object parameters = null, string outputCursor = "cursorParam")
{
return connection.Exec(c => {
c.CommandText = procedureName;
c.CommandType = CommandType.StoredProcedure;

// Create the parameters from the parameters object
if(parameters != null)
foreach(var property in parameters.GetType().GetPublicProperties())
c.Parameters.Add(new OracleParameter(property.Name, property.GetValue(parameters)));

// Add the output cursor
if(outputCursor != null)
c.Parameters.Add(new OracleParameter(outputCursor, OracleDbType.RefCursor) { Direction = ParameterDirection.Output });

// Return the result list
return c.ExecuteReader().ConvertToList<T>();
});
}
}

用法:

var download = connection.ExecStoredProcedure<ProductDownloads>(
"PRODUCT_DETAILS",
new { p_code = redemptionCode }
);

foreach (var productDownload in download)
{
Console.WriteLine(productDownload.Name);
}

所以论据是:

  1. 存储过程名称​​即PRODUCT_DETAILS

  2. 可选输入参数的对象
    new { p_code = redemptionCode, other = "value"}

  3. 可选输出光标的名称 - 默认为cursorParam

注意:此代码未经测试,因为我没有 Oracle 设置,但它确实可以编译,并且希望能以某种方式简化您的存储过程。

关于c# - Oracle 存储过程适用于 ADO.NET,但使用 OrmLite 会引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com