返回一个SQL变量的值从在Oracle SQL查询返回.NET code [英] Return an sql variable's value from within an Oracle Sql Query back to .NET code

查看:298
本文介绍了返回一个SQL变量的值从在Oracle SQL查询返回.NET code的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在过去的几个小时,我试图做的最简单的简单的事情(至少对于SQL Server)在O​​racle数据库中,通过使用ADO.NET .NET应用程序。这似乎是不可能的。

For the past few hours I am trying to do the simplest of the simple things (at least for SQL SERVER) in an Oracle Data Base, through a .NET application using ADO.NET. It seems impossible.

有关SQL SERVER我会做这个简单的任务,假设我有一个SqlCommand对象

For SQL SERVER I would do this simple task, supposing I have an SqlCommand object

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,我会收回新的ID在C#code中的ID变量。

That would insert a new record to table TABLE_1 and I would take back the new id in the "id" variable in c# code.

四个简单的步骤

  • 在声明一个变量
  • 将它设置为下一个可用的ID
  • 将纪录新变量
  • 返回变量的值

好,我成功地申报Oracle查询变量。此外,我(想)我设法给它一个值(用SELECT INTO)

Ok I managed to declare the variable in Oracle query. Also I (think) I managed to give it a value (With SELECT INTO)

我怎样才能拿回这个变量的值早在C#中?如何选择一个变量的值在Oracle SQL输出流?

How can I get back this variable's value back in c#? How can i SELECT a variable's value to the output stream in Oracle SQL?

我知道有更好的方法来实现取回一个标识列,但是这不是这里的问题。它可能是一个完全不同的例子。这个问题很简单的:我已经宣布,将从在.NET应用程序中执行一个Oracle SQL脚本中的变量。 如何我可以得到变量的值回C#,从Oracle查询?什么是上面的code等效与Oracle ADO.NET查询?

I know that there are better ways to achieve getting back an identity column, but that's not the question here. It could be a totally different example. The question is simple.: I have declared a variable inside an oracle sql script that will be executed from within .net app. How can i get the variable's value back to c#, from an oracle query? What is the above code's equivalent with Oracle ADO.NET query?

推荐答案

您需要使用的 ODP.NET (Oracle的Oracle数据访问组件):

You'll want to use ODP.NET (Oracle's Oracle Data Access Components):

这方面的一个例子是下面。请注意,在ODP.NET,你可以建立一个参数方向(输入,输入 - 输出,输出,返回值)与您正在运行的程序或语句的参数对应。在这个例子中,我抓住一个返回值,这是由DB通过序列和触发器生成一个ID(其创建自动的尽可能的.NET应用程序而言):

An example of this is below. Note that in ODP.NET, you can establish a parameters direction (input, inputoutput, output, returnvalue) to correspond with the parameters of the procedure or statement you're running. In this example, I'm grabbing a returnvalue, which is an ID that is generated by the db via a sequence and trigger (its created automagically as far as the .NET app is concerned):

            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)。

The ConvertFromDB is just a generic to cast the return value to its .NET equivalent (an int in this case).

希望有所帮助。

编辑:

您可以轻松地绑定值的数组(并检索返回值的数组)的ODP.NET:

You can easily bind an array of values (and retrieve an array of return values) in 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();
                    }
                }

这篇关于返回一个SQL变量的值从在Oracle SQL查询返回.NET code的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆