从C#调用Oracle存储过程?
请访问此ODP网站微软OracleClient的开发人员成立了由甲骨文: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html
而且下面是一个示例代码,可以让你开始称从C#的存储过程到Oracle。 PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT是建立在Oracle接受参数PUNIT,POFFICE,PRECEIPT_NBR并在T_CURSOR中返回结果的存储过程。
using Oracle.DataAccess;
using Oracle.DataAccess.Client;
public DataTable GetHeader_BySproc(string unit, string office, string receiptno)
{
using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
{
OracleDataAdapter da = new OracleDataAdapter();
OracleCommand cmd = new OracleCommand();
cmd.Connection = cn;
cmd.InitialLONGFetchSize = 1000;
cmd.CommandText = DatabaseHelper.GetDBOwner() + "PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("PUNIT", OracleDbType.Char).Value = unit;
cmd.Parameters.Add("POFFICE", OracleDbType.Char).Value = office;
cmd.Parameters.Add("PRECEIPT_NBR", OracleDbType.Int32).Value = receiptno;
cmd.Parameters.Add("T_CURSOR", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
为什么'InitialLONGFetchSize = 1000'首选?从DOCS '默认= 0. 将此属性设置为0会将LONG和LONG RAW数据全部检索到,直到应用程序明确请求它为止。# – KLIM8D 2015-10-01 07:32:57
它基本上是相同的机制作为与非查询命令:
- command.CommandText =的 存储过程的名称
- command.CommandType =
CommandType.StoredProcedure
- 尽可能多地调用command.Parameters.Add作为sp要求的参数数量
- command.ExecuteNonQuery
有很多的例子在那里,由谷歌返回的第一个是this one
还有你可能会陷入一个小陷阱,如果你的SP是一个函数,你的返回值参数必须首先在参数收集
在.NET中通过4.0版本可以做到这一点的方法相同的SQL Server存储的特效,但请注意,您需要:
using System.Data.OracleClient;
有some system requirements here,你应该验证您的方案都行。
微软是deprecating this namespace as of .Net 4所以未来需要第三方提供商。考虑到这一点,你可能会更好地使用Oracle Data Provider for .Net(ODP.NET)这个词,它具有不属于Microsoft类的优化。还有其他的第三方选择,但甲骨文在保持.Net开发者的权利方面有强烈的既得利益,所以他们应该是好的。
我现在得到的步骤需要从C#
//GIVE PROCEDURE NAME
cmd = new OracleCommand("PROCEDURE_NAME", con);
cmd.CommandType = CommandType.StoredProcedure;
//ASSIGN PARAMETERS TO BE PASSED
cmd.Parameters.Add("PARAM1",OracleDbType.Varchar2).Value = VAL1;
cmd.Parameters.Add("PARAM2",OracleDbType.Varchar2).Value = VAL2;
//THIS PARAMETER MAY BE USED TO RETURN RESULT OF PROCEDURE CALL
cmd.Parameters.Add("vSUCCESS", OracleDbType.Varchar2, 1);
cmd.Parameters["vSUCCESS"].Direction = ParameterDirection.Output;
//USE THIS PARAMETER CASE CURSOR IS RETURNED FROM PROCEDURE
cmd.Parameters.Add("vCHASSIS_RESULT",OracleDbType.RefCursor,ParameterDirection.InputOutput);
//CALL PROCEDURE
con.Open();
OracleDataAdapter da = new OracleDataAdapter(cmd);
cmd.ExecuteNonQuery();
//RETURN VALUE
if (cmd.Parameters["vSUCCESS"].Value.ToString().Equals("T"))
{
//YOUR CODE
}
//OR
//IN CASE CURSOR IS TO BE USED, STORE IT IN DATATABLE
con.Open();
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(dt);
希望调用程序这有助于
您能告诉我OracleDataAdapter da = new OracleDataAdatper(cmd );'是?这条线是否需要? – AlbatrossCafe 2015-08-14 16:26:20
此代码的工作很适合我调用Oracle存储过程
通过添加引用右键单击解决方案资源管理器中的项目名称>添加引用> .Net,然后添加名称空间。
using System.Data.OracleClient;
using System.Data;
然后将此代码粘贴在事件处理程序
string str = "User ID=username;Password=password;Data Source=Test";
OracleConnection conn = new OracleConnection(str);
OracleCommand cmd = new OracleCommand("stored_procedure_name", conn);
cmd.CommandType = CommandType.StoredProcedure;
--Ad parameter list--
cmd.Parameters.Add("parameter_name", "varchar2").Value = value;
....
conn.Open();
cmd.ExecuteNonQuery();
而且其完成了...快乐与C#
你能后的存储过程编码?你用什么库来连接数据库? ADO.NET?一个ORM(nHibernate,EF)?如果你想得到满足你需求的答案,你需要提供更多的细节。 – Oded 2010-10-15 08:24:52
如果您希望获得Oracle特定的答案,请将您的问题标记为Oracle。谢谢 ! – tsimbalar 2010-10-15 08:26:00
我以前使用过基本的SQL查询。但是,现在我想用已经编写的Oracle程序,使用C#代码。 – Rohan 2010-10-15 10:18:40