我从数据库表中读取数据。现在我想将数据存储在变量中。我需要根据列中包含的值来设置条件。
OracleCommand cmd = new OracleCommand("select user_name,parameter_name,parameter_value from table1 where user_name ='USER'", ocConnection);
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (dr["PARAMETER_NAME"].ToString() =="NAME1")
{
class1.Value1 = Convert.ToInt32(dr["PARAMETER_VALUE"].ToString());
}
if ((dr["PARAMETER_NAME"].ToString()) == "NAME2")
{
class1.Value2 = Convert.ToInt32(dr["PARAMETER_VALUE"].ToString());
}
dr.close();
dr.Dispose();
}
但这会产生错误,因为控件不会进入任何if块。 还会出现错误,例如:
System.IndexOutofRangeException
无法找到指定的列 结果集。
虽然表中有值。
答案 0 :(得分:0)
出于调试目的,您可以在创建阅读器后添加以下行,以获取将返回的字段名称(语句取自this answer):
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
因此,您可以检查是否会按预期返回PARAMETER_NAME
和PARAMETER_VALUE
。然后,您可以进一步调查您的问题。
注意:强>
我建议使用using
- 语句OracleCommand
和OracleDataReader
,因此您不必明确致电Dispose
。此外,在使用dr.Close()
- Block时,调用dr.Dispose()
和using
也不需要同样的事情。你也忘了处理OracleCommand
。使用第二个using
- Block,这也是固定的。
using(OracleCommand cmd = new OracleCommand("select user_name,parameter_name,parameter_value from table1 where user_name ='USER'", ocConnection))
{
cmd.CommandType = CommandType.Text;
using(OracleDataReader dr = cmd.ExecuteReader())
{
// check column names for debugging purposes
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
while (dr.Read())
{
if (dr["PARAMETER_NAME"].ToString() =="NAME1")
{
class1.Value1 = Convert.ToInt32(dr["PARAMETER_VALUE"].ToString());
}
if ((dr["PARAMETER_NAME"].ToString()) == "NAME2")
{
class1.Value2 = Convert.ToInt32(dr["PARAMETER_VALUE"].ToString());
}
}
}
}