OracleDataReader - 在设置默认下拉列表SelectedValue时处理NULL字段值

时间:2016-09-30 15:40:02

标签: c# oracle ado.net

我已获得以下代码:

  // Here is where we will read in all our values and populate the form with them
  lblBenCatX.Text = Convert.ToString(reader["Category"]);
  lblBenProvX.Text = Convert.ToString(reader["Provision"]);
  txtCommentBox.Text = Convert.ToString(reader["Feedback"]);

  ddlDefect1.SelectedValue = Convert.ToString(reader["Network"]);
  ddlIssue1.SelectedValue = Convert.ToString(reader["Issue_ID"]);
  ddlResolution1.SelectedValue = Convert.ToString(reader["Resolution_ID"]);
  ddlDefect2.SelectedValue = Convert.ToString(reader["Network2"]);
  ddlIssue2.SelectedValue = Convert.ToString(reader["Issue_ID2"]);
  ddlResolution2.SelectedValue = Convert.ToString(reader["Resolution_ID2"]);

前3行代码;没问题。但是,如果我有一个具有NULL值的记录,则下拉列表会破坏代码。所以,我认为我需要先检查字段以确保它不是NULL。类似的东西:

if (!Convert.ToString(reader["Network"]) = NULL)
{
  ddlDefect1.SelectedValue = Convert.ToString(reader["Network"]);
}

但是,这给了我一个错误:

  

作业的左侧必须是变量,属性或   索引

有什么想法吗?这是VS2015中带有Oracle后端的C#,如果有任何重要的话。

3 个答案:

答案 0 :(得分:2)

在C#中,你需要在一行==中使用两个等号来进行相等比较,而不是一个。一个等号=是一个赋值运算符。

if (first == second) { ... }

但是,在你的情况下,你会想要使用" not equals" !=运营商:

if (Convert.ToString(reader["Network"]) != null)

这比这更清洁,更有效:

if (!(Convert.ToString(reader["Network"]) == null))

请注意,我已将整个内部比较包裹在一些内容中,因此整个陈述被否定了;否则,它会认为您正在尝试说!Convert.ToString(reader["Network"]),并且正如您在此处的评论中指出的那样,您不能将!与字符串一起使用。

话虽如此,如果您要转换为字符串,那么最好使用string.IsNullOrEmpty()进行检查:

if (!string.IsNullOrEmpty(reader["Network"].ToString())))

但最好的方法是检查列值是否为空,而不是将其转换为字符串:

if (!reader.IsDBNull(["Network"]))

答案 1 :(得分:0)

=是一个赋值运算符,在设置值时使用。

==是一个等于运算符,用于确定某些内容是否等于其他内容。

!=也是一个等式运算符,与上面的运算符相反。所以,当某些东西 等于其他东西时。

实际上,在这种情况下你应该使用!=

if (Convert.ToString(reader["Network"]) != null)
{
  ddlDefect1.SelectedValue = Convert.ToString(reader["Network"]);
}

答案 2 :(得分:0)

你有几个选择。第一个是检查值DBNull是否与空字符串/空值不同。

if (!reader.IsDBNull([ordinalPositionOfNetworkInSelectStatement]))
   ddlDefect1.SelectedValue = Convert.ToString(reader["Network"]);

IDataReader.IsDBNull。唯一的问题是你需要知道你正在检查的列的序号位置。

另一种方法是在sql select语句中检查dbnull,如果是,则使用函数返回空字符串。这种方法的积极方面是您不必担心在c#代码中检查null,但我不确定它是否在您的oracle查询或视图中有任何负面影响。您可以使用COALESCE

执行此操作
SELECT Category, Provision, Feedback, COALESCE(Network, '') AS Network /*other columns*/ 
FROM ... -- rest of the query

免责声明 - 我的oracle语法缺乏,但COALESCE确实作为一个函数存在