使用reader检查字段是否包含空值

时间:2013-10-19 06:28:25

标签: c# sqlconnection

我想知道如何检查字段是否包含空值并将其替换为文本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");
            }
        }
    }

4 个答案:

答案 0 :(得分:1)

您可以在C#中查看:

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

或带有ISNULL的T-SQL:

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

答案 1 :(得分:1)

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

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

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

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

对于字符串列,只需重写它,因为字符串已经可以为空:

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

答案 2 :(得分:0)

您可以签入您的select语句或代码。在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()会将空值转换为空字符串。这是你可以做的第三个例子。

答案 3 :(得分:0)

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

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

E.g。 String myData = reader.IsDbNull(fieldname)? “”:reader.GetString(fieldname)

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

这更有效并且最小化了铸造。为了获得最大效率,您还应该使用字段索引而不是字段名称。每次使用字段名称时,都必须计算索引: 读者(“日期”)是reader.GetValue(reader.GetOrdinal(“Date”))