首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法设置OracleCommand.BindByName = true

无法设置OracleCommand.BindByName = true
EN

Stack Overflow用户
提问于 2017-09-28 09:24:06
回答 1查看 1.4K关注 0票数 0

我升级到了Oracle12.1,从那时起我的OracleCommand就不能工作了。我正在传递像cmd.Parameters["Name"].Value = username;这样的参数,但是作为Message envlink:System.IndexOutOfRangeException: Invalid index -1 for this OracleParameterCollection with Count=0获得异常。我搜索了一些OracleCommand.BindByName = true,但是找不到BindByName方法。我正在使用System.Data.OracleClient版本的4.0.0.0。如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 11:24:18

嗯,Parameters是收藏品。如果您试图按键获取元素,并且不存在--那么您将得到一个Invalid index异常--您应该在尝试访问具有该名称的元素之前添加一个参数。集合Parameters包含方法AddWithtValue -

代码语言:javascript
复制
cmd.Parameters.AddWithValue("Name", username);

例如(System.Data.OracleClient):

代码语言:javascript
复制
        var con = new OracleConnection(source);
        using (con)
        {
            con.Open();
            using (var cmd = con.CreateCommand())
            {
                cmd.CommandText = "SELECT :NAME FROM dual";
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.Parameters.AddWithValue("NAME", "Hello World!");

                using (var rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        string val = rdr.GetString(0);
                        MessageBox.Show(val);
                    }
                }
            }
        }

但是System.Data.OraceClient是不受欢迎的,微软不支持它。在ODP.Net中,您可以使用函数Add添加参数(相反,AddWithtValue是如何在System.Data.OracleClient中完成的):

代码语言:javascript
复制
cmd.Parameters.Add("Name", username);

代码语言:javascript
复制
cmd.Parameters.Add(
   new OracleParameter("Name", OracleDbType.Varchar2, username, ParameterDirection.Input)
);

例如(ODP.Net):

代码语言:javascript
复制
        using (OracleConnection con = new OracleConnection(source))
        {
            con.Open();
            using (var cmd = con.CreateCommand())
            {
                cmd.BindByName = true;
                cmd.CommandText = "select :NAME from dual";

                cmd.Parameters.Add("NAME", "Hello World!");
                /*
                command.Parameters.Add(
                  new OracleParameter("NAME", OracleDbType.Varchar2, "Hello World!", ParameterDirection.Input)
                 );
                */

                using (var rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        string val = rdr.GetString(0);
                        MessageBox.Show(val);
                    }
                }
            }
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46465546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档