Получение ошибки «Этот метод или свойство не может быть вызвано для значений NULL» - PullRequest
4 голосов
/ 22 февраля 2012

ОБНОВЛЕНИЕ 1:

В этой строке выдается исключение:

client_group_details.Add(new ClientGroupDetails(

ОРИГИНАЛЬНЫЙ ВОПРОС:

У меня есть следующий код, который я сократил с 30 столбцов данных из базы данных до 2 столбцов из базы данных. Я получаю сообщение об ошибке, когда любой из столбцов возвращает значение NULL:

public class ClientGroupDetails
{
    public String Col2;
    public String Col3;

    public ClientGroupDetails(String m_Col2, String m_Col3)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
    }

    public ClientGroupDetails() { }
}

[WebMethod()]
public List<ClientGroupDetails> GetClientGroupDetails(string phrase)
{
    var client_group_details = new List<ClientGroupDetails>();

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"select col2, col3 where col1 = @phrase", connection))
        {
            command.Parameters.Add("@phrase", SqlDbType.VarChar, 255).Value = phrase;

            connection.Open();
            using (reader = command.ExecuteReader())
            {
                int Col2Index = reader.GetOrdinal("col2");
                int Col3Index = reader.GetOrdinal("col3");

                while (reader.Read())
                {
                    client_group_details.Add(new ClientGroupDetails(
                        reader.GetString(Col2Index),
                        reader.GetString(Col3Index)));
                }
            }
        }
    }

    return client_group_details;
}

Я получаю ошибку:

Данные равны нулю. Этот метод или свойство нельзя вызывать для значений Null.

Я не уверен, что здесь делать, чтобы иметь дело со значениями NULL, поскольку приведенный выше код является урезанной версией.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Это потому, что reader.GetString не следует вызывать для DBNull значений. Попробуйте изменить свой код следующим образом:

client_group_details.Add(new ClientGroupDetails(
    reader.IsDbNull(Col2Index) ? null : reader.GetString(Col2Index),
    reader.IsDbNull(Col3Index) ? null : reader.GetString(Col3Index)));
1 голос
/ 22 февраля 2012

Вам нужно использовать IsDbNull, чтобы проверить, является ли столбец нулевым, перед вызовом GetString , что-то вроде:

string s1, s2;

if (reader.IsDbNull(Col1Index) == false)
{
   s1 = reader.GetString(Col1Index);
}

if (reader.IsDbNull(Col2Index) == false)
{
   s2 = reader.GetString(Col2Index);
}

client_group_details.Add(new ClientGroupDetails(s1, s2));
0 голосов
/ 22 февраля 2012

Есть несколько способов сделать это, но я думаю, что лучший подход для вашего кода - добавить простой вызов функции к вашему тексту SQL, а именно, функцию IsNull.

Вот ссылка на страницу руководства для этого: Ссылка IsNull MSDN

По сути, вы измените текст SQL так, чтобы он выглядел примерно так:

"select IsNull(col2, ''), IsNull(col3, '') where col1 = @phrase"

И теперь, если столбец в БД имеет значение null, он вместо этого возвратит пустую строку.

Вы также можете установить значения по умолчанию для ваших столбцов, или вы можете проверить для System.DBNull.Value на вашей стороне кода.

Удачи!

...