我有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();
非常感谢你。
答案 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);