通过 ODP 将记录从 pl-sql 传递到 C#

Posted

技术标签:

【中文标题】通过 ODP 将记录从 pl-sql 传递到 C#【英文标题】:Passing records from pl-sql to C# via ODP 【发布时间】:2013-04-19 15:39:42 【问题描述】:

我正在开发一个项目,该项目在 C# 中具有 Pl-Sql 和 GUI 的业务逻辑。

我在 Pl-Sql 中有一个记录类型,表示 files 表为:

type file_record is record(
    id        number
   ,file_name varchar2(256));

type file_record_type is table of file_record index by pls_integer;

我想将所有条目放到表中并将它们传递给 C#。

Pl-Sql 程序是:

procedure get_all_file_names(p_files out file_record_type) is

v_counter number := 1;

begin

for c in (select id
                ,file_name
            from files) loop
  p_files(v_counter).id := c.id;
  p_files(v_counter).file_name := c.file_name;
  v_counter := v_counter + 1;
end loop;

end get_all_file_names;

我通过 C# 调用这个过程,如下所示:

// get pmp entries from inside a specific file
    public DataSet getAllPmpFileNames(string commandText)
    
        DataSet dataSet = new DataSet();

        OracleCommand oracleCommand = new OracleCommand();

        OracleParameter oracleParameter = new OracleParameter("p_files", OracleDbType.Object);
        oracleParameter.Direction = ParameterDirection.Output;
        oracleParameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
        oracleCommand.Parameters.Add(oracleParameter);

        oracleCommand.CommandText = commandText;
        oracleCommand.CommandType = CommandType.StoredProcedure;

        try
        
            oracleCommand.Connection = m_Connection;
            OracleDataAdapter oracleDataAdapter = new OracleDataAdapter(oracleCommand);
            oracleDataAdapter.Fill(dataSet);
        
        catch (Exception)
        
            throw;
        

        return dataSet;
    

当我从 C# 调用它时,我得到了异常 OracleParameter.Size is invalid

因为我不知道,所以在打电话之前我不能给出尺寸。我应该先获取大小然后调用过程吗?

或者有没有其他优雅的方法可以从 C# 访问多个数据库元素?

【问题讨论】:

【参考方案1】:

创建一个视图而不是存储过程,并使用 OracleDataReader 来填充您的数据集。

【讨论】:

以上是关于通过 ODP 将记录从 pl-sql 传递到 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何通过引用从 c# 到 c++ 传递字节数组

通过表单将变量从 Javascript 传递到 C#?

通过互操作将字符串数组从 C# 传递到 C++

通过单声道将数组从 C++ 传递给 C#

如何通过 C++-CLI 回调和委托将字符串从 C++-CLI 传递到 C#

将回调参数从 C# 传递到非托管 C++