首页 > 解决方案 > C# - 存储过程中没有参数的 Pl/SQL 问题

问题描述

我有一个如下所示的存储过程:

    PROCEDURE semifinished_lable_data(p_piece_num_id     IN INTEGER,
                                        p_piece_id         OUT STRING,
                                        p_tickness         OUT NUMBER)
   IS begin
    select p_piece_id,p_tickness into p_piece_id,p_tickness from piece p where p.piece_num_id=p_piece_num_id;
   end;

我已经从数据库中执行了它,它运行良好。当我从 c# 应用程序执行它时,我没有得到任何价值。

然后当我研究这个问题时,我补充说:cmd.BindByName = true 但是这次我得到了以下错误

列表中命名参数的多个实例

C#代码:

 OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.InitialLONGFetchSize = 1000;
            var seciliProsedur = "QUA_PRINTING.semifinished_lable_data";
  cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = seciliProsedur;
            cmd.BindByName = true;
            object piece_num_id = gridViewMain.GetFocusedRowCellValue(gridViewMain.FocusedColumn);
 OracleParameter PAR_ID1 = new OracleParameter();
            PAR_ID1.ParameterName = "p_piece_id ";
            PAR_ID1.OracleDbType = OracleDbType.Int32;
            PAR_ID1.Direction = System.Data.ParameterDirection.Input;
            PAR_ID1.Value =piece_num_id;
            PAR_ID1.Size = 100;
            cmd.Parameters.Add(PAR_ID1);
cmd.Parameters.Add("p_piece_id", OracleDbType.Varchar2, 1000, null, ParameterDirection.Output);
cmd.Parameters.Add("p_tickness", OracleDbType.Double,200, null, ParameterDirection.Output);

 conn.Open();


            var da = new OracleDataAdapter(cmd);
            var dt = new DataTable();
            da.Fill(dt);

我怎么解决这个问题 ?

标签: c#sqloracle

解决方案


其实我没用过CommandType = CommandType.StoredProcedure

尝试这个

cmd.CommandType = CommandType.Text;
seciliProsedur = "BEGIN QUA_PRINTING.semifinished_lable_data(:p_piece_num_id  , :p_piece_id, :p_tickness); END;"

OracleParameter PAR_ID1 = new OracleParameter();
PAR_ID1.ParameterName = "p_piece_num_id";
...
cmd.Parameters.Add("p_piece_id", OracleDbType.Varchar2, ParameterDirection.Output);
cmd.Parameters("p_piece_id").DbType = DbType.Varchar2;
cmd.Parameters.Add("p_tickness", OracleDbType.Varchar2, 240, null, ParameterDirection.Output);
cmd.Parameters("p_tickness").DbType = DbType.String;

我认为你必须设置DbTypeOracleDbType属性。

然后你的代码的另一个问题是

var da = new OracleDataAdapter(cmd);
var dt = new DataTable();
da.Fill(dt);

您的程序不返回任何结果集(即 RefCursor),因此上述命令不起作用。利用

cmd.ExecuteNonQuery()

推荐阅读