2013-08-26 2 views
1

У меня есть SqlDataReader, который заполняет несколько текстовых полей, но проблема в том, что они NULL. Я получаю исключение, которое я не знаю, как обращаться.SqlDataReader null exception

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 Textboxes, есть ли простое решение? Я хотел бы оставить текстовые поля пустыми, когда значение равно null, все отлично работает для ShortDatString.

Мне нужно, чтобы понять, как справиться с этим, как, когда значение из БД NULL:

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

Спасибо так много.

+2

Ouch - SQL-инъекция через конкатенацию –

+0

Что такое 'precti2', если' read' уже является 'SqlDataReader'? –

+0

Вы проверяете значение null во втором столбце - почему не первый? –

ответ

3

Вы должны проверить IsDBNull:

if(!precti2.IsDBNull(59)) 
{ 
    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); 

это:

using(var command = new SqlCommand("SELECT * FROM zajezd WHERE [email protected] and [email protected]", 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); 
+0

Спасибо за ответы, есть ли решение, которое разрешило бы это для 20 текстовых полей? Как это должно быть реализовано для каждого текстового поля правильно? – Marek

+0

@Marek: Вы должны добавить sql-параметр для каждого динамического (пользовательского) ввода, так что нет, автоматизма нет. –

+0

@Marek: Отредактировал мой ответ, чтобы предоставить метод, который может помочь сократить ваш код. –