2015-04-07 6 views
3

При вставке нового ученика в базу данных их GPA не вводится, поэтому, когда я вызываю обработчик события для отображения GPA, он сбой.Невозможно преобразовать объект в double

object value;  
sql = string.Format("SELECT ROUND(AVG(CAST(Rating AS Float)), 4) FROM GPA WHERE StudentID={0};;", StudentID); 
value = this.datatier.ExecuteScalarQuery(sql); 

double avgGPA; 
if (value != null) 
{ 
    System.Windows.Forms.MessageBox.Show("null"); 
    avgGPA = Convert.ToDouble(value); 
} 
else avgGPA = 0.0; 

Я попытался это исправить, где я убеждаюсь value!=null, прежде чем я Convert.ToDouble(), но я врезаться независимо, в частности, на этой линии:

avgGPA = Convert.ToDouble(value); 

с ошибкой: Объект не может быть отлит из DBNull в другие типы.

Мой вопрос в том, как назначить значение по умолчанию, например 0.0, чтобы программа не сработала, когда GPA не найден?

EDIT: Все были на месте решения, благодаря всем! Возникает новый вопрос, является ли DBNull всегда нулевым запросом базы данных?

+0

изменения, если – Ewan

+1

также, я бы не установил ГПД в 0, когда вы не можете найти его (значение = DBNull.Value!). сделать его нулевым или что-то – Ewan

+0

Никто не использует 'значение - это DBNull' #sadpanda – leppie

ответ

2

Просто проверить, если это DBNull

avgGPA = value == DBNull.Value ? 0D : Convert.ToDouble(value); 
1

В проверке запроса, если нулевое значение возврата по умолчанию с помощью isnull():

SELECT ROUND(AVG(CAST(isnull(Rating,0) AS Float)), 4) 
+0

Не будет ли это еще нулевым, если строк нет? – juharr

+0

в текущем случае запись будет доступна точно –

1

Вы можете сделать это с обеих сторон, в зависимости от того имеет наибольший смысл учитывая ваше обстоятельство :

-- In the query, return zero if null 
select isnull(ROUND(AVG(CAST(Rating AS Float)), 4), 0.0) from... 

or

// In the code, check for DBNull 
if (value != DBNull.Value) 
{ 
    avgGPA = Convert.ToDouble(value); 
} 
+0

будет работать sql, если строки не возвращаются? – Ewan

+0

текущий запрос всегда будет возвращать запись –

+1

Да, этот возвращает 0, потому что 'isnull' обернут вокруг совокупности данных. Если вы только что делали 'isnull (Rating, 0)', и ваш запрос не возвращал никаких записей, тогда 'value' фактически было бы' null', а не 'DBNull', так как запрос не возвращал никаких записей вообще. Если вы делали «isnull» в рейтинге, а не в среднем и не имели записей, вы бы получили «DBNull». Но 'isnull' на' avg' означает, что если 'avg' заканчивается как null по какой-либо причине, вы все равно сможете преобразовать это значение в нуль в запросе. –

1

Вы можете попробовать:

double avgGPA = Convert.IsDBNull(value) ? 0.0 : Convert.ToDouble(value); 
Смежные вопросы