【问题标题】:using reader to check if a field contains null value使用阅读器检查字段是否包含空值
【发布时间】:2013-10-28 02:12:46
【问题描述】:

我想知道如何检查字段是否包含空值并将其替换为文本 N/A 或不显示该字段。但是如果字段包含 null 我不希望代码中断,我希望它继续运行,直到所有字段都填充了一个值。

C#代码

using (var connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "SELECT FirstName, LastName, Date FROM EOI WHERE (FormID = '13')";
        connection.Open();
        using (var reader = command.ExecuteReader())
        {
            while(reader.Read())
            {
                Label1.Text = reader["FirstName"].ToString();
                Label2.Text = reader["LastName"].ToString();
                DateTime Text = Convert.ToDateTime(reader["Date"]);
                Label3.Text = Text.ToString("d");
            }
        }
    }

【问题讨论】:

标签: c# sqlconnection


【解决方案1】:

您可以在 C# 中进行检查:

if(reader["FirstName"]==null)
{
 // Do something
}

或在 T-SQL 中使用ISNULL:

SELECT ISNULL(FirstName,'N/A'), ISNULL(LastName,'N/A'), Date FROM EOI

【讨论】:

    【解决方案2】:

    我假设您遇到问题的空值是Date 列。 C# 中的 DateTime 不能为空,因为它是一个结构。您可能希望将其转换为可为空的 DateTime:

    DateTime? date = (DateTime?)reader["Date"];
    

    现在由您在将其转换为字符串时执行逻辑:

    dateLabel.Text = date != null ? date.Value.ToString("d") : "N/A";
    

    对于字符串列,只需将其重写如下,因为字符串已经可以为空:

    firstNameLabel.Text = (string)reader["FirstName"] ?? "N/A";
    

    【讨论】:

    • 最后一个有用吗?我相信它在 VB 中会出错,因为 DBNull.Value != null
    • 一旦你将它转换为它的 CLR 类型,它就不再是 DBNull.Value。
    【解决方案3】:

    您可以签入您的选择语句或代码。在 SQL 中:

    SELECT IsNull(FirstName, 'N/A') as FirstName, 
            Coalesce(LastName, 'N/A') as LastName, Date FROM EOI WHERE (FormID = '13');
    

    在 .Net 中,您需要将其与 DbNull.Value 进行比较:

    Label1.Text = reader["FirstName"] == DBNull.Value ? "N/A" :  Convert.ToString(reader["FirstName"]);
    

    请注意,在上面的示例中,Convert.ToString() 会将空值转换为空字符串。这是您可以做的第三个示例。

    【讨论】:

    • 将示例与 DBNull.Value 一起使用并工作,感谢您的快速响应和帮助。
    • 我还应该声明 IsNull() 和 Coalesce() 是两个相似的 TSQL 函数,它们做的事情相对相同。有些人对此有很大的争论,例如 AMD 与 Intel,但我说那些对这种情况感兴趣的人可以自己查找这些功能。
    【解决方案4】:

    如果您事先知道可以使用的类型(我在 iPhone 上输入的伪代码):

    KnownType myData = reader.IsDbNull(fieldname) ? MyDefaultValue : reader.GetKnownType(fieldname)

    例如 字符串 myData = reader.IsDbNull(fieldname) ? "" : reader.GetString(fieldname)

    String dateValue = reader.IsDbNull(fieldname) ? “无日期”:reader.GetDate(fieldname).ToString()

    这样效率更高,并且可以最大限度地减少强制转换。为了获得最大效率,您还应该使用字段索引而不是字段名称。每次使用字段名称时,都必须计算索引: reader("Date") 是 reader.GetValue(reader.GetOrdinal("Date"))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多