我升级到了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。如何解决这个问题?
发布于 2017-09-28 11:24:18
嗯,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是不受欢迎的,微软不支持它。在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);
}
}
}
}https://stackoverflow.com/questions/46465546
复制相似问题