DataReader.Read() 返回空

DataReader.Read() returning empty

我基本上有一个生成项目列表(第 1 列)及其描述(第 2 列)的查询。有 3 个不同的项目(共 170 个)没有描述,所以我硬编码我的程序以针对这 3 个项目进行调整。但是,每当我的 reader 到达第一个具有空列的项目时,reader 甚至无法读取该项目。相反,它说 "Enumeration Yielded No Results"

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] as string; 处被捕获; (不为空的字段)

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

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)));

}