C#执行oracle存储过程,存储过程代码为:
create or replace procedure proc_test(pCursor OUT pak_pub.ut_cursor) AS
begin
open pCursor for select * from scott.emp;
end proc_tes;
其中pak_pub.ut_cursor的定义为:
create or replace package pak_pub
as
type ut_cursor is ref cursor;
end;
两种方式:1、用微软自带的ORACLE数据访问接口(using System.Data.OracleClient)
注意.NET 4.0里已经没有了System.Data.OracleClient
2、使用ODP.NET(引用oracle客户端里的Oracle.DataAccess.dll)
第一种方式:
//存储过程参数设置
OracleParameter[] sqlParme = new OracleParameter[1];
//参数1
sqlParme[0] = new OracleParameter("pCursor", OracleType.Cursor);
sqlParme[0].Direction = ParameterDirection.Output;
DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);
DBAccess.DBExecStoredProcedure函数实现
public static DataTable DBExecStoredProcedure(string spName, OracleParameter[] sqlParme)
{
try
{
//使用微软的ORACLE访问接口
OraCmd.CommandText = spName;
OraCmd.CommandType = CommandType.StoredProcedure;
OraCmd.Parameters.Clear();//先清空
foreach (OracleParameter parme in sqlParme)
{
OraCmd.Parameters.Add(parme);
}
DataSet ds1;
DateTime EndTime;
TimeSpan sp;
ds1 = new DataSet();
DateTime BegTime = System.DateTime.Now;
OracleDataAdapter da1 = new OracleDataAdapter(OraCmd);//取出数据
da1.Fill(ds1);
EndTime = System.DateTime.Now;
string str = "spare time:" + (EndTime - BegTime).ToString();
DataTable dt = ds1.Tables[0];
//调试
if (dt != null && dt.Rows.Count != 0)
MessageBox.Show("返回记录数" + dt.Rows.Count.ToString() + "\n" + str);
TraceLog.Trace("执行时间", "返回记录数" + dt.Rows.Count.ToString() + "\n" + str);
return dt;
}
catch (InvalidCastException e)
{
TraceLog.Trace("错误", e.Message + " IOException source:"+e.Source);
return null;
}
}
第二种方式:
//使用ORACLE客户端访问接口
OracleParameter[] sqlParme = new OracleParameter[1];
//参数1
sqlParme[0] = new OracleParameter("pCursor", OracleDbType.RefCursor);
sqlParme[0].Direction = ParameterDirection.Output;
DataTable re = DBAccess.DBExecStoredProcedure("proc_test", sqlParme);
DBAccess.DBExecStoredProcedure函数实现同第一种方式的.
数据库连接(ODP.NET方式)
//DB连接
public static bool DBConnect(string puser,string pwd,string ds){
try
{
if (OraConn!= null)//如果连接没关闭,先关闭
OraConn.Close();
string ConString = "Data Source=" + ds + ";User Id=" + puser + ";Password=" + pwd;
OraConn = new OracleConnection(ConString);
OraCmd = new OracleCommand("", OraConn);
OraConn.Open();
return true;
}
catch{
return false;
}
}
是用.net自带的访问接口连接方法稍有不同:
(连接字串应该这样写)
string ConString =
"Data Source=TEST;user=TEST001;password=123456"
;
感觉上其实区别不大,只是如果要用到PL/SQL的数组变量的时候,第二种方式的特点就突显出来了,(而且微软已经声明.NET 4.0后不在包含oracle的访问接口,所以很多开发者都开始转向使用oracle公司提供的访问接口)
oracle客户端的数据访问接口支持Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray,数组变量,而且支持长度限制,由于我演示的没有传入参数,这里就简单说一下,有传入参数的时候,这样
sqlParme[0] = new OracleParameter("param1", OracleDbType.Varchar2,1000);//可限制传入参数长度
sqlParme[0].Direction = ParameterDirection.Input;
string s = "传入参数";
sqlParme[0].Value = s;
如果传入参数是PL/SQL的数组类型那就这样传
sqlParme[0] = new OracleParameter("pDimensionFields", OracleDbType.Varchar2,1000);
sqlParme[0].Direction = ParameterDirection.Input;
sqlParme[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray
string[] s =new string[]{ "1","2","3"};
sqlParme[0].Value = s;