如何根据同一行的另一列检索列的特定值?

时间:2016-02-04 13:20:47

标签: c# .net oracle

我从数据库表中读取数据。现在我想将数据存储在变量中。我需要根据列中包含的值来设置条件。

    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无法找到指定的列   结果集。

虽然表中有值。

1 个答案:

答案 0 :(得分:0)

出于调试目的,您可以在创建阅读器后添加以下行,以获取将返回的字段名称(语句取自this answer):

var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();

因此,您可以检查是否会按预期返回PARAMETER_NAMEPARAMETER_VALUE。然后,您可以进一步调查您的问题。

注意:

我建议使用using - 语句OracleCommandOracleDataReader,因此您不必明确致电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());
            }
        }
    }
}