DataReader.Read()返回空

时间:2016-12-15 19:39:01

标签: c# sql oracle sqldatareader

我基本上有一个查询,可以生成项目列表(第1列)及其描述(第2列)。有3个不同的项目(170个)没有描述,所以我硬编码我的程序来调整这3个项目。但是,每当我的读者到达具有空列的第一个项目时,读者甚至无法读取该项目。相反,它说"枚举没有结果"

var reader = command.ExecuteReader();
while (reader.Read())
{
    var node = reader[0] as string;
    string fullNodeName = string.Empty; 
    if (string.IsNullOrEmpty((string)reader[1]))
    {
        switch ((string)reader[0])
        {
            case "xxx":
                fullNodeName = "jhhfgnfh";
                break;
            case "xxx":
                fullNodeName = "fhnfgndfgdh";
                break;
            case "xxx":
                fullNodeName = "werqrqwerq";
                break;
        }
    }
    else
    {
        fullNodeName = reader[1] as string;
    }
    _nodeTokenList.Add(new Carriers.NodeToken(node, string.Format("{0} - {1}", node, fullNodeName)));

}

数据看起来像

Node   Description

XXX  ||  YYYYYYY YYY YYY

XXX  ||  YYYYYYY YYY YYY

XXX  || YYYYYYY YYY YYY

XXX  ||  YYYYYYY YYY YYY

XXX  ||                

XXX  ||  YYYYYYY YYY YYY

具有空描述字段的行是程序开始执行的时间。奇怪的是它进入了这一行的while循环,但异常在var node = reader [0]被捕获为字符串; (非空的字段)

1 个答案:

答案 0 :(得分:1)

您应该将(string)reader[1]换成Convert.ToString(reader[1])。它包含DBNull值,而不是null,并且转换为string是导致错误的原因。 Convert类可以更好地处理转换:

var reader = command.ExecuteReader();
reader.Read();
while (reader.Read())
{
    var node = Convert.ToString(reader[0]);
    string fullNodeName = string.Empty; 
    if (string.IsNullOrEmpty(Convert.ToString(reader[1])))
    {
        switch ((string)reader[0])
        {
            case "xxx":
                fullNodeName = "jhhfgnfh";
                break;
            case "xxx":
                fullNodeName = "fhnfgndfgdh";
                break;
            case "xxx":
                fullNodeName = "werqrqwerq";
                break;
        }
    }
    else
    {
        fullNodeName = reader[1] as string;
    }
    _nodeTokenList.Add(new Carriers.NodeToken(node, string.Format("{0} - {1}", node, fullNodeName)));

}