无法设置OracleCommand.BindByName = true

时间:2017-09-28 09:24:06

标签: c# .net oracle

我已升级到Oracle 12.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。 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

cmd.Parameters.AddWithValue("Name", username);

例如(System.Data.OracleClient):

        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已被弃用,Microsoft不会支持。在ODP.Net中,您可以使用函数Add添加参数(而不是AddWithtValue如何在System.Data.OracleClient中完成):

cmd.Parameters.Add("Name", username);

cmd.Parameters.Add(
   new OracleParameter("Name", OracleDbType.Varchar2, username, ParameterDirection.Input)
);
例如

ODP.Net):

        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);
                    }
                }
            }
        }