【问题标题】:Read Oracle SYS_REFCURSOR in C# Entity Framework?在 C# Entity Framework 中阅读 Oracle SYS_REFCURSOR?
【发布时间】:2019-10-10 06:14:23
【问题描述】:

我有一个简单的 C# 控制台应用程序,它的代码是这样的:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SHRSContext shrsContext = new SHRSContext();

            DbCommand cmd = shrsContext.Database.Connection.CreateCommand();

            cmd.CommandText = "PKG_SHRS.GETLOGINATTEMPT";
            cmd.CommandType = CommandType.StoredProcedure;

            var pinUsername = new OracleParameter("pinUsername", OracleDbType.Varchar2, ParameterDirection.Input);
            pinUsername.Value = "admin";

            var poutLoginAttemptCount = new OracleParameter("poutLoginAttemptCount", OracleDbType.Int16, ParameterDirection.Output);

            cmd.Parameters.Add(pinUsername);
            cmd.Parameters.Add(poutLoginAttemptCount);

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            cmd.Connection.Close();

            Console.WriteLine(poutLoginAttemptCount.Value.ToString());
            Console.ReadLine();
        }
    }
}

它使用实体框架和Oracle 11g 作为后端。它在 PKG_SHRS.GETLOGINATTEMPT 包中调用 Oracle 过程,并且运行良好。

上面的代码只是提供了一个作为数值数据类型的输出参数。如果我需要获取一个表SYS_REFCURSOR 作为输出参数,我需要在给定的代码中进行哪些更改?

【问题讨论】:

    标签: c# entity-framework entity-framework-6 entity-framework-4 sys-refcursor


    【解决方案1】:

    我假设VALIDATELOGIN 过程的输出参数是poutUserCursor 并且它的类型是SYS_REFCURSOR。试试这个代码。

    SHRSContext shrsContext = new SHRSContext();
    
    DbCommand cmd = shrsContext.Database.Connection.CreateCommand();
    
    cmd.CommandText = "PKG_SHRS.GETLOGINATTEMPT";
    cmd.CommandType = CommandType.StoredProcedure;
    
    var pinUsername = new OracleParameter("pinUsername", OracleDbType.Varchar2, ParameterDirection.Input);
    pinUsername.Value = "admin";
    
    // Assuming output parameter in the procedure is poutUserCursor
    var poutUserCursor = new OracleParameter("poutUserCursor", OracleDbType.RefCursor, ParameterDirection.Output);
    
    cmd.Parameters.Add(pinUsername);
    cmd.Parameters.Add(poutUserCursor);
    
    cmd.Connection.Open();
    
    DbDataReader dr = cmd.ExecuteReader();
    
    string column1 = string.Empty;
    string column2 = string.Empty;
    
    // Assume this will return one row. If multiple rows return, use while loop
    if (dr.Read())
    {
        // GetString will return string type. You can change as you need
        column1 = dr.GetString(0);
        column2 = dr.GetString(1);
    }
    
    cmd.Connection.Close();
    

    【讨论】:

    • 这是我期待的代码。非常感谢。
    • 我试过用它代替ExecuteNonQueryAsyncRead() 不让进去。我不确定这是从ref cursor 获取数据的正确方法,如果它已经在 SP 中填充。 ExecuteNonQueryAsync 执行,我只是不知道如何使用返回的游标数据...
    猜你喜欢
    • 2016-10-25
    • 2016-01-02
    • 2014-08-25
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多