【问题标题】:DataReader.Read() returning emptyDataReader.Read() 返回空
【发布时间】:2016-12-15 19:39:01
【问题描述】:

我基本上有一个生成项目列表(第 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] as string; 处捕获了异常。 (不为空的字段)

【问题讨论】:

  • 提问时请多注意代码格式。您的大部分代码都缩进了数英里,使其更难阅读。在发布之前,请务必仔细阅读您将要发布的内容,并问问自己它的格式是否符合您在尝试回答时想要阅读的方式。
  • 谢谢,会记住的
  • “Enumeration Yielded No Results”听起来像是调试器消息。当你实际运行代码时会发生什么?
  • 它捕获所有成员,直到具有空字段的行然后它抛出异常“无法将'System.DBNull'类型的对象转换为'System.String'类型。”}。 ..当我检查变量时,没有结果是存储在阅读器中的
  • 在转换为字符串之前必须检查 DBNull

标签: c# sql oracle sqldatareader


【解决方案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)));

}

【讨论】:

  • 我喜欢这个答案,但异常在上面 2 行被触发,var node = reader[0]
  • 更新了,在reader[0]的转换上再次使用Convert.ToString()
猜你喜欢
  • 2013-04-30
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2021-07-07
  • 2013-09-30
  • 2021-08-23
  • 2013-04-07
相关资源
最近更新 更多