C# SqlDataReader空异常

C# SqlDataReader空异常,c#,sql,sql-server,winforms,C#,Sql,Sql Server,Winforms,我有一个SqlDataReader,它可以填充多个文本框,但问题是当它们为空时,我会遇到一个异常,我不知道如何处理 SqlCommand command = new SqlCommand("SELECT * FROM zajezd WHERE akce='" + akce + "' and rocnik='" + klientClass.Rocnik() + "'", spojeni); spojeni.Open(); SqlDa

我有一个SqlDataReader,它可以填充多个文本框,但问题是当它们为空时,我会遇到一个异常,我不知道如何处理

 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:数据为空。

我有20个文本框,有没有简单的解决办法?当值为null时,我想将文本框留空,ShortDatString的一切都正常工作

我需要弄清楚当DB中的值为NULL时如何处理这种情况:

s_ub_cen.Text = precti2.GetDecimal(59).ToString();
非常感谢你

您需要检查:

另外,通过使用SQL参数防止SQL注入,不要连接字符串来构建SQL查询

而不是:

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

编辑

有什么解决方案可以解决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);

哎哟-通过连接进行SQL注入什么是
precti2
如果
read
已经是
SqlDataReader
?您在第二列上检查null-为什么不是第一列?我发现对20个文本框进行此操作很难。我只是想问是否有更好的解决方案。谢谢你的回答,有没有解决20个文本框问题的方案?因为这应该在每个文本框中实现,对吗?@Marek:您必须为每个动态(用户)输入添加一个sql参数,所以不,没有自动功能。@Marek:编辑我的答案以提供一种可能有助于缩短代码的方法。
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);