2013-04-29 3 views
4

Я пытаюсь получить данные в gridview из базы данных, чтобы отображать их в текстовых полях при щелчке, и он отлично работает для строк без нулевых данных, хотя, поскольку мои столбцы int имеют некоторые null значения мои методы GetInt32 продолжают возвращать «Data is Null. Этот метод или свойство не могут быть вызваны значениями Null».Как сделать Sqlcommand принимать значения null

Есть ли простой способ исправить или обойти это? Я могу заменить GetInt32 другим методом? Я бы хотел, чтобы данные были пустыми, чтобы показать пустые/пустые текстовые поля, если это возможно. Вот мой код, если у вас есть предложения, спасибо.

public ArrayList GetAllPersonnel(int WorkerID) { 
     using (var connection = new SqlConnection(connectionString)) { 
      connection.Open(); 
      String query = "Select * FROM Personnel WHERE WorkerID = " + WorkerID; 

      using (var command = new SqlCommand(query, connection)) { 
       var reader = command.ExecuteReader(); 
       var list = new ArrayList(); 
       while (reader.Read()) { 
        String firstname = reader.GetString(1); 
        String lastname = reader.GetString(2); 
        String occupation = reader.GetString(3); 
        String deployment = reader.GetString(4); 
        int disasterid = reader.GetInt32(5); 
        String location = reader.GetString(6); 
        int deployedhours = reader.GetInt32(7); 
        int resthours = reader.GetInt32(8); 

        list.Add(firstname); 
        list.Add(lastname); 
        list.Add(occupation); 
        list.Add(deployment); 
        list.Add(disasterid); 
        list.Add(location); 
        list.Add(deployedhours); 
        list.Add(resthours); 
       } 
       connection.Close(); 
       reader.Close(); 
       return list; 
      } 
     } 
    } 
+0

Добро пожаловать в Stack Overflow, будущее меня. –

ответ

2

ОК, так что вы эффективно сказать, что все, что отображение должно быть string типа, который прекрасно, я просто сделать эту точку, потому что вы заявили, вы хотите даже целые числа, отображаемые как пустая строка. Итак, как насчет этого кода?

String firstname = reader.GetString(1); 
String lastname = reader.GetString(2); 
String occupation = reader.GetString(3); 
String deployment = reader.GetString(4); 
String disasterid = reader.IsDBNull(5) ? string.Empty : reader.GetString(5); 
String location = reader.GetString(6); 
String deployedhours = reader.IsDBNull(7) ? string.Empty : reader.GetString(7); 
String resthours = reader.IsDBNull(8) ? string.Empty : reader.GetString(8); 

list.Add(firstname); 
list.Add(lastname); 
list.Add(occupation); 
list.Add(deployment); 
list.Add(disasterid); 
list.Add(location); 
list.Add(deployedhours); 
list.Add(resthours); 

Теперь, почему я сказал, что вы хотите использовать все, как строка в том, что значение по умолчанию для int является 0 и что не будет отвечать требованиям пустого текстового поля.

+0

Да, я думаю, это то, к чему я стремился, но теперь я получаю Unable, чтобы наложить объект типа «System.Int32» на тип ошибки «System.String». Знаете ли вы, что я должен исправить? Спасибо –

+0

@NickV, на какой строке? Какова ценность поля в «читателе» в то время? Потому что мы можем пойти другим путем. –

+0

Мне удалось это исправить, спасибо за вашу помощь! –

4

Вы должны использовать IsDBNull метод SqlDataReader

int resthours = (!reader.IsDBNull(8) ? reader.GetInt32(8) : 0); 

или, более непосредственно

list.Add((!reader.IsDBNull(8) ? reader.GetInt32(8).ToString(): string.Empty)); 

сказал, что я заметил, что вы используете конкатенацию, чтобы построить команду SQL текст для извлечения записей. Пожалуйста, не делайте этого. Это очень опасно и может привести к Sql Injection

String query = "Select * FROM Personnel WHERE WorkerID = @wkID"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@wkID", WorkerID); 
    var reader = command.ExecuteReader(); 
    .... 
+0

Спасибо за быстрый ответ! Я исправил конкатенацию строк, и это не сработало, хотя, когда я заменил «int rest hours» и list.add (resthours) этими строками, я получаю аргумент 1: невозможно преобразовать из «int» в «string». Есть что-то, что мне не хватает? –

+0

Да, это работает отлично, спасибо! –

1

У вас есть по крайней мере два способа разобраться в этом

  • изменить ваш SQL, чтобы выбрать либо ноль или все, что вы думаете, подходит вместо нулевого значения. Это гарантирует, что вы всегда будете иметь целочисленное значение в столбце integer. Это может быть сделано следующим образом

    выберите ISNULL (ColumnName, 0), как ColumnName от ххх

  • Всегда извлечение объекта из считывателя и проверить, если он является недействительным или нет. Если он равен нулю, замените его соответствующим значением.

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