SqlDataReader null异常

时间:2013-08-26 07:28:02

标签: c# sql sql-server winforms

我有SqlDataReader,它填充多个文本框,但问题是当它们为NULL时,我得到一个我不知道如何处理的异常。

 SqlCommand command = new SqlCommand("SELECT * FROM zajezd WHERE akce='" + akce + "' and rocnik='" + klientClass.Rocnik() + "'", spojeni);
                spojeni.Open();
                SqlDataReader read= command .ExecuteReader();

                if (read.Read())
                {

                s_ub_cen.Text = read.GetDecimal(59).ToString();
                object nulldate = (s_ub_dat.Text = read.IsDBNull(61) ?
                    string.Empty : read.GetDateTime(61).ToShortDateString());
 }

例外:System.Data.SqlTypes.SqlNullValueException: Data are null.

我有20个文本框,有什么简单的解决方案吗?当值为null时,我想将文本框保留为空,一切都适用于ShortDatString。

我需要弄清楚当DB中的值为NULL时如何处理它:

s_ub_cen.Text = precti2.GetDecimal(59).ToString();

非常感谢你。

1 个答案:

答案 0 :(得分:3)

您需要检查IsDBNull

if(!precti2.IsDBNull(59))
{
    s_ub_cen.Text = precti2.GetDecimal(59).ToString();
}

另外,通过使用sql-parameters来防止SQL-Injection,不要连接字符串来构建sql查询。

而不是:

SqlCommand command = new SqlCommand("SELECT * FROM zajezd WHERE akce='" + akce + "' and rocnik='" + klientClass.Rocnik() + "'", spojeni);

这样:

using(var command = new SqlCommand("SELECT * FROM zajezd WHERE akce=@akce and rocnik=@rocnik", spojeni))
{
    command.Paramaters.AddWithValue("@akce", akce);
    command.Paramaters.AddWithValue("@rocnik", klientClass.Rocnik());
    // ....
}

修改

  

有没有解决方案可以解决20个文本框?

一般来说,没有自动化。您必须为每个动态输入提供sql参数。

但是,如果您正在寻找一种优雅的方式来获得“安全字符串”,您可以使用此扩展程序:

public static class DataExtensions
{
    public static string GetSafeString(this SqlDataReader reader, int colIndex)
    {
        if (!reader.IsDBNull(colIndex))
            return reader[colIndex].ToString();
        else
            return string.Empty;
    }
}

您以这种方式使用此方法:

_ub_cen.Text = reader.GetSafeString(59);