0

我必须修改一个与 Oracle 一起使用的 Visual Studio 2010 C# 项目,查看一些代码我发现了一个函数,该函数返回一个List<>从数据库存储过程(光标)加载的值

while (myIDataReader.Read())
{
    // OK
    myTable.myStringField = myIDataReader["TableStringField"].ToString();
    // ¿?
    myTable.myIntField =
    Convert.ToInt32((myIDataReader["TableIntField"] == DBNull.Value) ? null : myIDataReader["myTableField"]);
}

一切都好,只是想知道,assign时给出了什么条件myTable.myIntField,我知道这个列可以为空,但我不明白语法,如果有人能解释我会很感激

4

2 回答 2

1

你说的是这条线?

myTable.myIntField =
Convert.ToInt32((myIDataReader["TableIntField"] == DBNull.Value) ? null : myIDataReader["myTableField"]);

如果你把这个语句分开,你就会有一种条件,通常称为三元运算符,在这里解释

conditional ? if_true_do_this : if_false_do_this

它实际上只是一种不同的语法:

if(conditional) {
    if_true_do_this;
} else {
    if_false_do_this
}

之后,它只是将结果传递给以Convert.ToInt32()将其从 astring转换为int

所以那行代码只是一个更简洁的版本:

if(myIDataReader["TableIntField"] == DBNull.Value)
{
    myTable.myIntField = Convert.ToInt32(null);
}
else
{
    myTable.myIntField = Convert.ToInt32(myIDataReader["myTableField"]);
}
于 2012-12-07T13:12:09.277 回答
0

上面的语法可以正常工作,这意味着:

TableIntField可能包含数据库空值。
这在 NET 中通过DBNull对象及其值字段表示。

代码检查是否TableIntField包含DBNull.Valuevia C#三元运算符
如果检查结果为真,则将 null 用作 Convert.ToInt32 的参数,根据MSDN 文档,这会导致分配给 myTable.myIntField 的值为零。

于 2012-12-07T13:10:56.760 回答