我已升级到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
。
如何解决这个问题?
答案 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);
}
}
}
}