最近的项目都是做信息系统的,需要频繁的与数据库进行交互。很多对数据库的操作,如多表的查询,更新,插入,以及一些数据库逻辑的判断等等,如果写成存储过程或者包的形式然后再在代码中调用会方便很多。以下是一种通用的方法,对于参数的个数类型都没什么限制,只要在赋值的时候确定即可。具体的代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /// <summary>
2 /// 执行存储过程或包
3 /// </summary>
4 /// <param name="cmdText_prc">存储过程的名字或包中的过程、函数名(格式:包名.函数名)</param>
5 /// <param name="cmdParms">参数列表(可调用MakeParam生成参数)</param>
6 /// <returns>参数返回</returns>
7 public OracleParameter[] ExecuteProc(string cmdText_prc, params OracleParameter[] cmdParms)
8 {
9 DataSet dataset = new DataSet();
10 OracleCommand cmd = new OracleCommand();
11 cmd.Connection = m_conn;
12 cmd.CommandType = CommandType.StoredProcedure;
13 cmd.CommandText = cmdText_prc;
14 AddInParaValues(cmd, cmdParms);
15 try
16 {
17 cmd.ExecuteNonQuery();
18 }
19 catch (System.Exception ex)
20 {
21 cmd.Parameters["P_MSG"].Value = (Object)ex.Message;
22 }
23 OracleParameter[] parms = new OracleParameter[cmd.Parameters.Count];
24 cmd.Parameters.CopyTo(parms, 0);
25 return parms;
26 }
27
28 private void AddInParaValues(OracleCommand cmd, params OracleParameter[] cmdParms)
29 {
30 for (int i = 0; i < cmdParms.Length; i++)
31 {
32 cmd.Parameters.Add(cmdParms[i].ToString(), (Object)cmdParms[i].Value);
33 cmd.Parameters[cmdParms[i].ToString()].OracleType = cmdParms[i].OracleType;
34 cmd.Parameters[cmdParms[i].ToString()].Size = cmdParms[i].Size;
35 cmd.Parameters[cmdParms[i].ToString()].Direction = cmdParms[i].Direction;
36 }
37 }
38
39
40 /// <summary>
41 /// 生成oracle参数
42 /// </summary>
43 /// <param name="ParamName">字段名</param>
44 /// <param name="otype">数据类型</param>
45 /// <param name="direct">数据方向</param>
46 /// <param name="size">数据大小</param>
47 /// <param name="Value">值</param>
48 /// <returns></returns>
49 public static OracleParameter MakeParam(string ParamName,System.Data.OracleClient.OracleType otype,
50 System.Data.ParameterDirection direct, int size, Object Value)
51 {
52 OracleParameter para = new OracleParameter(ParamName, Value);
53 para.OracleType = otype;
54 para.Direction = direct;
55 para.Size = size;
56 return para;
57 }
例程:
在包A中有个存储过程为B
B的形式为
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 create or replace procedure B
2 ( p_no varchar2,
3 p_code out pls_integer,
4 p_msg out varchar2) is
调用的方法为
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 OracleParameter[] Parms = new OracleParameter[3];
2 Parms[0] = ConnForOracle.MakeParam("p_no", OracleType.NVarChar, ParameterDirection.Input, 3, "125");
3 Parms[1] = ConnForOracle.MakeParam("p_code", OracleType.Int32, ParameterDirection.Output, 3, 0);
4 Parms[2] = ConnForOracle.MakeParam("p_msg", OracleType.NVarChar, ParameterDirection.Output, 400, null);
5 //ConnForOracle为上面调用方法所在的类
6 Parms = ora.ExecuteProc("A.B", Parms);//ora为一个数据库连接