c# - 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);
我怎么解决这个问题 ?
解决方案
其实我没用过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;
我认为你必须设置DbType
和OracleDbType
属性。
然后你的代码的另一个问题是
var da = new OracleDataAdapter(cmd);
var dt = new DataTable();
da.Fill(dt);
您的程序不返回任何结果集(即 RefCursor),因此上述命令不起作用。利用
cmd.ExecuteNonQuery()
推荐阅读
- mysql - 从 SQL Server 插入 MySQL 导致前 2 行空白
- javascript - 如何检测来自外部组件的匹配路由
使用 react-router 匹配的组件? - javascript - Selenium:获取未在“检查元素”中显示的 innerHTML 的代码源
- google-cloud-platform - 谷歌云任务队列未并行运行
- javascript - 如何从 Angular 组件中的变量显示 HTMLElement?
- java - 错误:无法在单个 dex 文件中容纳请求的类(# 方法:67451 > 65536)
- gcc - 如何更改 GCC 编译器的选项?
- docker - 在图像修剪期间,过滤器是否适用于未使用的图像或悬空图像或两者?
- mongodb - 无法将对象添加为另一个现有 JSON 对象的子字段
- http - Arduino UNO 和调制解调器 Sim800L - 发送查询参数时出现 DNS 错误