使用SqlDataReader时可能出现意外的引用比较以获得值比较

时间:2015-03-18 17:36:28

标签: c# combobox sqldatareader selectedindexchanged

要选择药物的company_namedate_of_mfgdate_of_exp,首先选择medicine_name,并根据其SelectedIndexchanged事件,使用以下内容代码:

     private void combomedicine_SelectedIndexChanged(object sender, EventArgs e)
    {
        combocompany.Items.Clear();
        string str = "select med_name,mnf_name from  tbl_mdcnentry";
        command.Connection = connection;
        command.CommandText = str;
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {


            if (combomedicine.SelectedItem.ToString() == reader.GetValue(0).ToString())
            {
                combocompany.Items.Add(reader.GetValue(1).ToString());
                break;
            }

        }
        reader.Close();
    }

在调试时,行if (combomedicine.SelectedItem.ToString()                        == reader.GetValue(0).ToString())警告:Possible unintended reference comparison; to get a value comparison, cast the right hand side to type string(虽然我已经投放了)并且从下拉菜单中选择新项目时不会产生任何输出。

我已经进行了搜索,并且随处可见的解决方案是添加ToString()但仍无法正常工作。

2 个答案:

答案 0 :(得分:1)

为了比较字符串,我更喜欢使用string.Equals,你可以提供比较类型,我建议尝试使用InvariantCultureIgnoreCase来避免套管问题。

您是否已调试并检查两个字符串实际上是否相同?

另外,考虑将数据访问代码从用户界面移开,从长远来看,它将更容易维护和理解您的代码。

编辑:将DataReader封装在一个使用块中也是一种更好的做法:

using(SqlDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        if (string.Equals(combomedicine.SelectedItem.ToString(), 
                          reader.GetValue(0).ToString(), 
                          StringComparison.InvariantCultureIgnoreCase)
        {
            combocompany.Items.Add(reader.GetValue(1).ToString());
            break;
        }
    }
}

答案 1 :(得分:0)

这是我在完成here后所做的事情。

 private void combomedicine_SelectedIndexChanged(object sender, EventArgs e)
    {
        combocompany.Items.Clear();
        GetAutoCombobox_filled();
    }

  //Helper method
    public void GetAutoCombobox_filled()
    {

        // int select_item;
        string str = "select med_name,mnf_name,mfg_date,exp_date from  tbl_mdcnentry";
        command.Connection = connection;
        command.CommandText = str;
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {


            if (combomedicine.SelectedItem.ToString() == (string)reader["med_name"])
            {
                combocompany.Items.Add(reader.GetValue(1).ToString());
                dateTimePicker2.Text=reader.GetValue(2).ToString();
                dateTimePicker3.Text = reader.GetValue(3).ToString();
                break;
            }

        }
        reader.Close();


    }