【问题标题】:SQL DataReader how to show null-values from querySQL DataReader 如何显示查询中的空值
【发布时间】:2010-05-05 12:34:07
【问题描述】:

我有一个 DataReader 和一个 StringBuilder (C#.NET),以下列方式使用;

while (reader.Read())
{
    sb.AppendFormat("{0},{1},{2},",reader["Col1"], reader["Col2"], reader["Col3"]);
}

这对我的使用非常有用,但是当一行为空时,我需要它返回“null”,而不仅仅是“”。有什么好的方法可以做到这一点?

非常感谢您的建议

【问题讨论】:

    标签: c# sql stringbuilder datareader


    【解决方案1】:

    试试:

    Convert.IsDBNull(reader["Col1"]) ? "null" : reader["Col1"]
    

    或者,如果您要重复使用它,这可能是紧密范围扩展方法的理想候选者,例如:

    public static class ExtensionMethods
    {
        public static object GetValueOrNull(this SqlDataReader reader, string key)
        {
            return Convert.IsDBNull(reader[key]) ? (object)"null" : reader[key];
        }
    }
    

    所以你可以这样写:

    var valueOfReader = reader.GetValueOrNull("Col1");
    

    如果您需要在一个 StringBuilder.AppendFormat 调用中多次使用此逻辑,这肯定会让事情变得更整洁:

    while (reader.Read())
    {
        sb.AppendFormat("{0},{1},{2},",reader.GetValueOrNull("Col1"), reader.GetValueOrNull("Col2"), reader.GetvalueOrNull("Col3"));
    }
    

    【讨论】:

    • 很好的答案!非常感谢您花时间写下所有这些。
    • 当然,如果你确实沿着扩展方法路线走,你可以返回任何东西(比如你传入的值)如果它是空的,而不仅仅是“空”——这将使它更灵活=)
    • 简单的代码效果很好,但似乎“这个 SqlDataReader”在静态上下文中不起作用。并且“当前上下文中不存在名称'读者'”。您对如何解决这些问题有快速评论吗?不幸的是,我是这里的新手。
    • 啊,我的错 - 对不起,我错过了一些东西 - 我已经相应地编辑了扩展方法:)
    • @Rob - 感谢您抽出宝贵时间!我非常感谢。我设法让你的代码正常工作。
    【解决方案2】:
    reader["Col1"] == DBNull.Value ? "null" : Convert.ToString(reader["Col1"])
    

    【讨论】:

    • 我投票删除了我的答案,结果是一样的。我迟到了几秒钟!
    【解决方案3】:
    reader.IsDBNull(indexOfColumn) ? "null" : reader[indexOfColumn].ToString();
    

    【讨论】:

      【解决方案4】:
      (string)reader["Col1"] ?? "null"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多