+-

在过去的几个小时中,我试图通过使用ADO.NET的.NET应用程序在Oracle数据库中完成最简单的事情(至少对于SQL SERVER而言).似乎不可能.
对于SQL SERVER,假设我有一个SqlCommand对象,我将完成此简单任务
comm.CommandText = @"
DECLARE @next_id INT
SET @next_id = (SELECT ISNULL(MAX(id_col),0) FROM TABLE_1) + 1
INSERT INTO TABLE_1 (id_col, col1, ...) VALUES (@next_id, val1, ...)
SELECT @next_id";
int id = Convert.ToInt32(comm.ExecuteScalar());
这将在表TABLE_1中插入一条新记录,我将在c#代码的“ id”变量中取回新的id.
四个简单步骤
>声明一个变量
>将其设置为下一个可用的ID
>插入带有新变量的记录
>返回变量的值
好的,我设法在Oracle查询中声明了变量.我也(想)我设法给它一个值(使用SELECT INTO)
如何在C#中取回该变量的值?如何在Oracle SQL中选择变量的值到输出流?
我知道有更好的方法可以返回身份列,但这不是这里的问题.这可能是一个完全不同的例子.问题很简单.:我在oracle sql脚本中声明了一个变量,该变量将从.net应用程序中执行.如何从oracle查询中将变量的值返回给c#?上面的代码与Oracle ADO.NET查询等效吗?
最佳答案
您将要使用 ODP.NET(Oracle的Oracle数据访问组件):
下面是一个示例.请注意,在ODP.NET中,您可以建立参数方向(输入,输入输出,输出,返回值)以与您正在运行的过程或语句的参数相对应.在此示例中,我获取一个返回值,该返回值是db通过序列和触发器生成的ID(就.NET应用而言,它是自动创建的):
int event_id = 0;
using (OracleConnection oraConn = new OracleConnection(connStr))
{
string cmdText = @"insert into EVENT
(EVENT_NAME, EVENT_DESC)
values
(:EVENT_NAME, :EVENT_DESC)
RETURNING EVENT_ID INTO :EVENT_ID
";
using (OracleCommand cmd = new OracleCommand(cmdText, oraConn))
{
oraConn.Open();
OracleTransaction trans = oraConn.BeginTransaction();
try
{
OracleParameter prm = new OracleParameter();
cmd.BindByName = true;
prm = new OracleParameter("EVENT_NAME", OracleDbType.Varchar2);
prm.Value = "SOME NAME"; cmd.Parameters.Add(prm);
prm = new OracleParameter("EVENT_DESC", OracleDbType.Varchar2);
prm.Value = "SOME DESC"; cmd.Parameters.Add(prm);
prm = new OracleParameter( "EVENT_ID"
, OracleDbType.Int32
, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery();
trans.Commit();
// return value
event_id = ConvertFromDB<int>(cmd.Parameters["EVENT_ID"].Value);
}
catch
{
trans.Rollback();
throw;
}
finally
{
trans.Dispose();
}
oraConn.Close();
}
}
ConvertFromDB只是将返回值转换为其等效的.NET(在这种情况下为int)的泛型.
希望能有所帮助.
编辑:
您可以在ODP.NET中轻松绑定值数组(并检索返回值数组):
using (OracleConnection oraConn = new OracleConnection(connStr))
{
string cmdText = @"insert into TEST_EVENT
(EVENT_NAME, EVENT_DESC)
values
(:EVENT_NAME, :EVENT_DESC)
RETURNING EVENT_ID INTO :EVENT_ID
";
using (OracleCommand cmd = new OracleCommand(cmdText, oraConn))
{
oraConn.Open();
OracleTransaction trans = oraConn.BeginTransaction();
try
{
string[] event_names = new string[2];
string[] event_descs = new string[2];
int[] event_ids = new int[2];
event_names[0] = "Event1";
event_descs[0] = "Desc1";
event_names[1] = "Event2";
event_descs[1] = "Desc2";
OracleParameter prm = new OracleParameter();
cmd.Parameters.Clear();
cmd.ArrayBindCount = 2;
cmd.BindByName = true;
prm = new OracleParameter("EVENT_NAME", OracleDbType.Varchar2);
prm.Value = event_names; cmd.Parameters.Add(prm);
prm = new OracleParameter("EVENT_DESC", OracleDbType.Varchar2);
prm.Value = event_descs; cmd.Parameters.Add(prm);
prm = new OracleParameter( "EVENT_ID"
, OracleDbType.Int32
, ParameterDirection.ReturnValue);
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery();
trans.Commit();
// get return values
event_ids = (int[])(cmd.Parameters["EVENT_ID"].Value);
}
catch
{
trans.Rollback();
throw;
}
finally
{
trans.Dispose();
}
oraConn.Close();
}
}
点击查看更多相关文章
转载注明原文:c#-从Oracle Sql查询中将sql变量的值返回回.NET代码 - 乐贴网