将Oracle存储过程中的SeqNbrs列表返回给C#

时间:2015-04-02 18:33:43

标签: c# .net oracle stored-procedures plsql

我正在寻求帮助重写程序。我很确定我在这里的某处使用了错误的数据类型,所以请让我知道如何改进以下内容。

我正在尝试使用此表中的seq #s:

create table myschema.file_path_table
(
  encrypt_file_path_seq_nbr NUMBER(15) not null,
  file_path                 VARCHAR2(1000)
)

我在oracle中创建了这个包:

TYPE file_paths IS TABLE OF myschema.file_path_table.file_path%TYPE INDEX BY BINARY_INTEGER;
TYPE path_seq_nbrs IS TABLE OF myschema.file_path_table.encrypt_file_path_seq_nbr%TYPE INDEX BY BINARY_INTEGER;

PROCEDURE GETFILEPATHSEQNBRS(IN_FILE_PATHS     IN FILE_PATHS,
                             OUT_FILE_PATH_SEQ OUT PATH_SEQ_NBRS) 
IS
    V_FILE_PATH     myschema.file_path_table.FILE_PATH%TYPE;
    V_FILE_PATH_SEQ myschema.file_path_table.ENCRYPT_FILE_PATH_SEQ_NBR%TYPE;
BEGIN
    IF IN_FILE_PATHS.COUNT < 1 THEN
        RAISE_APPLICATION_ERROR(-20999, 'in_file_paths.COUNT: ' || IN_FILE_PATHS.COUNT);
    END IF;
    FOR INDX IN 1 .. IN_FILE_PATHS.COUNT LOOP
        GETFILEPATHSEQNBR(IN_FILE_PATHS(INDX), V_FILE_PATH_SEQ);
        OUT_FILE_PATH_SEQ(INDX) := V_FILE_PATH_SEQ;
    END LOOP;
END GETFILEPATHSEQNBRS;

内部GETFILEPATHSEQNBR()在file_path_table上执行查找以获取文件路径的序列,或者如果路径当前没有序列#,则在那里插入新行。所以我不能只是批量选择#的序列。我的变量IN_FILE_PATHS和OUT_FILE_PATH_SEQ是我正在尝试做的正确数据类型吗?我觉得我不在这里,有更简单的方法吗?

收集完所有序列号后,我需要将此列表返回给我的C#app。该代码如下所示:

private static void GetFilePathSeqNbrs(ref EncryptFilesTable table)
{
    IEnumerable<string> pathQuery = (from row in table.rowArray
                                     select row.path).Distinct();
    try
    {
        using (OracleCommand cmd = new OracleCommand("myschema.PKG_ENCRYPT.GETFILEPATHSEQNBRS", EncryptUtils.connection))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.BindByName = true;

            OracleParameter p_out_values = new OracleParameter();
            p_out_values.ParameterName = "OUT_FILE_PATH_SEQ";
            p_out_values.OracleDbType = OracleDbType.Int64;
            p_out_values.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            p_out_values.Size = pathQuery.Count();
            p_out_values.Value = pathQuery.ToArray();
            p_out_values.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(p_out_values);

            OracleParameter p_in_values = new OracleParameter();
            p_in_values.ParameterName = "IN_FILE_PATHS";
            p_in_values.OracleDbType = OracleDbType.Varchar2;
            p_in_values.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            p_in_values.Size = pathQuery.Count();
            p_in_values.Value = pathQuery.ToArray();
            p_in_values.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(p_in_values);

            //cmd.ExecuteNonQuery();
            OracleDataAdapter da = new OracleDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);  //the datatable here is always empty.

            foreach (System.Data.DataRow dr in dt.Rows)
            {
                foreach (System.Data.DataColumn dc in dt.Columns)
                {
                    Console.Write(dr[dc].ToString());
                }
            }
        }
    }
    catch (Exception e)
    {
        EncryptUtils.Log(Const.LogMsgType.Error, e.GetBaseException().ToString());
    }
}

运行此代码集完成没有错误,但我的结果数据表为空。如果我只通过PL / SQL中的测试窗口运行该过程,它将返回我期望的OUT_FILE_PATH_SEQ。为什么我的数据表为空?谢谢你的帮助。

0 个答案:

没有答案