2014-10-01 2 views
0

У меня есть следующая функция, которая проверяет, является ли пользователь (strU) существует в таблице для столбца, если это возвращает 1, в противном случае возвращает 0:Почему ExecuteScalar возвращение ошибка NullReferenceException

public int AddDataScalar(string strU) 
{ 
    string strQueryExistence = "SELECT 1 FROM [OB].[h].[OP_PEONS] WHERE Executive= '" + strU + "'"; 
    int inNum; 
    using (SqlConnection con = new SqlConnection(strConn)) 
    { 
     con.Open(); 
     SqlCommand cmd = new SqlCommand(strQueryExistence, con); 
     object value = cmd.ExecuteScalar().ToString(); 
     if (value != null) 
     { 
      inNum = 1; 
     } 
     else 
     { 
      inNum = 0; 
     } 
     con.Close(); 
    } 
    return inNum; 
} 

Это неудачу в этой строке: object value = cmd.ExecuteScalar().ToString();

со следующей ошибкой: Object reference not set to an instance of an object.

Как решить это?

+0

http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and -how-do-i-fix-it –

ответ

1

ExecuteScalar возвращает null, если ваше условие WHERE не дает никакого результата.
Если вы применяете какое-либо преобразование, когда ExecuteScalar возвращает null, у вас проблемы.

Сказал, что я действительно предлагаю некоторые изменения в запрос

public int AddDataScalar(string strU) 
{ 
    string strQueryExistence = @"IF EXISTS(SELECT 1 FROM [OB].[h].[OP_PEONS] 
           WHERE Executive= @stru) SELECT 1 ELSE SELECT 0"; 
    int inNum = 0; 
    using (SqlConnection con = new SqlConnection(strConn)) 
    using (SqlCommand cmd = new SqlCommand(strQueryExistence, con)) 
    { 
     con.Open(); 
     cmd.Parameters.AddWithValue("@stru", strU); 
     inNum = Convert.ToInt32(cmd.ExecuteScalar()); 
    } 
    return inNum; 
} 

Первое является IF EXISTS T-SQL функции, это самый быстрый способ узнать, если конкретная запись существует или нет в таблице. Второй момент - использование параметризованного запроса, чтобы избежать проблем синтаксического анализа и сценариев Sql Injection.

ПЧ СУЩЕСТВУЕТ заявление позволяет быть уверенным, что ExecuteScalar не возвращает нуль, поскольку в этом случае ELSE часть будет возвращать ноль

+0

Спасибо. Я отредактировал ваш код для отсутствующего ')' – SearchForKnowledge

+1

Ну, в этом случае нет необходимости в тройном операторе, поэтому я его удалил. – Steve

+0

Итак, функция вернет 0, если пользователь не существует в столбце «Исполнительный», иначе будет возвращен 1? – SearchForKnowledge

2

Согласно MSDN (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx):

The first column of the first row in the result set, or a null reference (Nothing in Visual Basic) if the result set is empty.

Вы звоните .ToString() (почему?) На нулевой объект, так как нет никаких результатов возвращается. Пропустите вызов .ToString(), и он должен работать нормально.

1

Если object, указанный cmd.ExecuteScalar(), является null, вы получите это исключение. Использование:

string value = System.Convert.ToString(cmd.ExecuteScalar()); 

если вам нужен результат преобразуется в string.

1

когда cmd.ExecuteScalar() возвращает нулевые затем null.ToString() бросает исключение . В вашем случае, просто используйте Тренари оператор:

inNum = cmd.ExecuteScalar() == null ? 0 : 1; 

Реализация может быть

public int AddDataScalar(string strU) { 
    using (SqlConnection con = new SqlConnection(strConn)) { 
    con.Open(); 

    // Make your SQL readable: use @"" strings 
    strQueryExistence = 
     @"SELECT 1 
      FROM [OB].[h].[OP_PEONS] 
     WHERE Executive = @prm_Executive"; 

    // using is a better practice 
    using (SqlCommand cmd = new SqlCommand(strQueryExistence, con)) { 
     // parameters are better than hardcoding 
     cmd.Parameters.AddWithValue("@prm_Executive", strU); 

     return cmd.ExecuteScalar() == null ? 0 : 1; 
    } 
    } 
} 
+0

Благодарим за редактирование. – SearchForKnowledge

+0

Я хочу вернуть 0, если пользователь не существует в столбце «Исполнительный», иначе возвратите 1, если пользователь существует. – SearchForKnowledge

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