我刚刚开始阅读有关存储过程的内容。谁能帮我从C#调用oracle中的存储过程?
答案 0 :(得分:32)
请访问oracle为Microsoft OracleClient开发人员设置的ODP站点: 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;
}
}
答案 1 :(得分:16)
我现在已经完成了从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);
希望这有帮助
答案 2 :(得分:5)
它基本上与非查询命令的机制相同:
CommandType.StoredProcedure
有很多例子,Google返回的第一个例子是this one
如果你的SP是一个函数,你可能会陷入一个小陷阱,你的返回值参数必须是参数集合中的第一个
答案 3 :(得分:4)
此代码适用于我调用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#编写快乐编码
答案 4 :(得分:2)
在.Net到版本4中,这可以用与SQL Server存储过程相同的方式完成,但需要注意:
using System.Data.OracleClient;
在您的方案中,您应该验证的some system requirements here是正常的。
Microsoft是deprecating this namespace as of .Net 4,因此将来需要第三方提供商。考虑到这一点,您可能最好使用单词go中的Oracle Data Provider for .Net(ODP.NET) - 这具有Microsoft类中没有的优化。还有其他第三方选择,但甲骨文对保持.Net开发人员的强大既得利益,所以他们应该是好的。
答案 5 :(得分:2)
连接到Oracle很丑。这是一些带有using语句的更简洁的代码。其他许多示例并未在其创建的对象上调用IDisposable方法。
using (OracleConnection connection = new OracleConnection("ConnectionString"))
using (OracleCommand command = new OracleCommand("ProcName", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("ParameterName", OracleDbType.Varchar2).Value = "Your Data Here";
command.Parameters.Add("SomeOutVar", OracleDbType.Varchar2, 120);
command.Parameters["return_out"].Direction = ParameterDirection.Output;
command.Parameters.Add("SomeOutVar1", OracleDbType.Varchar2, 120);
command.Parameters["return_out2"].Direction = ParameterDirection.Output;
connection.Open();
command.ExecuteNonQuery();
string SomeOutVar = command.Parameters["SomeOutVar"].Value.ToString();
string SomeOutVar1 = command.Parameters["SomeOutVar1"].Value.ToString();
}
答案 6 :(得分:0)
代替
cmd = new OracleCommand("ProcName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";
您还可以使用以下语法:
cmd = new OracleCommand("BEGIN ProcName(:p0); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";
请注意,如果设置了cmd.BindByName = False
(这是默认设置),则必须按照与在命令字符串中写入的顺序相同的顺序添加参数,实际名称无关紧要。对于cmd.BindByName = True
,参数名称必须匹配,顺序无关紧要。
在调用函数的情况下,命令字符串如下:
cmd = new OracleCommand("BEGIN :ret := ProcName(:ParName); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ret", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";
// cmd.ExecuteNonQuery(); is not needed, otherwise the function is executed twice!
var da = new OracleDataAdapter(cmd);
da.Fill(dt);