2013-09-27 2 views
10

Здравствуйте, у меня есть этот код, который считывает данные из SQL DB.Использование имени столбца при использовании SqlDataReader.IsDBNull

Я не знаю, как мне его редактировать, поэтому я могу использовать исходное имя столбца, а не индекс столбца.

string query = "SELECT * FROM zajezd WHERE event='" + thisrow+ "' AND year='" + klientClass.Year() + "'"; 
SqlCommand cmd= new SqlCommand(query, spojeni); 
spojeni.Open(); 
SqlDataReader read= cmd.ExecuteReader(); 


if (read.Read()) 
{ 
    maskedTextBox2.Text = read.IsDBNull(24) ? 
     string.Empty : 
     read.GetDateTime(24).ToString("MM/dd/yyyy"); 

Заранее благодарен.

+3

Значит, вы используете SELECT *, а колонка, которой вы являетесь, - это 24-я колонна? Это ужасный способ кодирования - что происходит, когда кто-то меняет таблицу (например, добавляет столбец где-то между 1-23)? Вы можете получить сообщение об ошибке, или, может быть, вы получите другой столбец времени и не заметите. Кроме того, вам нравится SQL-инъекция? Пожалуйста, используйте параметризованные запросы. Динамический SQL, как это, почему в Интернете так много эксплойтов SQL-инъекций каждый день. –

+0

@NathanKoop в вашем редактировании вы добавили закрытие. Возможно, вы правы, но, как вы можете видеть из приведенных ниже комментариев, это дает очень конкретное значение для запроса, используемого OP. Если OP нуждается только в одном столбце, тогда возможен более эффективный подход. – Steve

+0

@Steve извините за задержку ответа. Я не вижу комментариев (-ов), на которые вы ссылаетесь, но я удалил фигурные фигуры. Для меня это не очень важно, если он есть или нет :-) –

ответ

14

Вы ищете SqlDataReader.GetOrdinal

Согласно MSDN

Возвращает порядковый номер столбца, учитывая имя столбца.

if (read.Read()) 
{ 
    int colIndex = read.GetOrdinal("MyColumnName"); 
    maskedTextBox2.Text = read.IsDBNull(colIndex) ? 
        string.Empty : 
        read.GetDateTime(colIndex).ToString("MM/dd/yyyy"); 

} 

Как примечание стороны, ваш запрос открыт для SQL инъекций. Не использовать конкатенацию, чтобы построить команду SQL, но использовать параметризованный запрос

string query = "SELECT * FROM zajezd WHERE [email protected] AND [email protected]"; 
    using(SqlCommand cmd= new SqlCommand(query, spojeni)) 
    { 
    spojeni.Open(); 
    cmd.Parameters.AddWithValue("@p1",thisrow); 
    cmd.Parameters.AddWithValue("@p2",klientClass.Year().ToString()); 
    using(SqlDataReader read= cmd.ExecuteReader()) 
    { 
     ...... 
    } 
    } 
+0

Downvoter, не могли бы вы объяснить, что мне не хватает? – Steve

+0

Я не спускал вниз, но если бы я делал это, я бы сделал чтение за пределами цикла. EDIT: Просто видел, что это оператор 'if', а не цикл. Я думаю, он должен использовать ExecuteScaler. –

+0

Мы предполагаем, что OP нуждается только в одном столбце, но это невозможно проверить из незавершенного кода, но если OP действительно нужен только один столбец из одной записи, тогда я соглашусь, что весь запрос должен быть переписан. – Steve

7

Я хотел бы попробовать (string)(reader["ColumnName"] == DBNull.Value ? "" : reader["ColumnName"]);, чтобы сделать это имя столбца.

+0

OP должен использовать IsDBNull, и это невозможно сделать с именем столбца .... – Steve

+0

Это что мы делаем и прекрасно работает (строка) (читатель ["ColumnName"] == DBNull.Value? "": reader ["ColumnName"]); –

+0

Ну, это правильно, но почему бы вам не добавить к вашему ответу? – Steve

Смежные вопросы