executescalar: объект не может быть преобразован из DBNull в другие типы

У меня проблема, когда во время работы программы нет данных/значений, я получаю следующую ошибку:

Объект нельзя преобразовать из DBNull в другие типы.

Я попытался проверить это, используя if dr.hasrow(), но все равно получаю ошибки.

drqry = "SELECT max(num) FROM tbCVinfo WHERE cvno LIKE '%" & cvstr & "%'"

cmd2.CommandText = drqry
cmd2.Connection = con

Dim result As String = ""

cv = Convert.ToInt32(cmd2.ExecuteScalar())
'''''''''in this section I'm getting the error.

cv = cv + 1
If cv >= 0 And cv <= 9 Then
  ...............
Else
    cn = "0001"
End If
cn = result

cvno = cn

person DIANA ROSE ARNAIZ    schedule 17.05.2018    source источник
comment
Это проблема отладки. Ошибка совершенно ясна, выполните шаг, и строка, на которой она прерывается, - это ваша проблема, в частности, вызов ExecuteScalar, поскольку он, вероятно, не возвращает ничего, кроме DBNull. Можно решить, изменив запрос...   -  person zaggler    schedule 17.05.2018
comment
Если соответствующих записей нет, то агрегатные функции, такие как MAX, возвращают NULL, что означает DBNull.Value в ADO.NET. Очевидно, что это не целое число, поэтому его можно преобразовать в Integer. Вам нужно либо изменить свой запрос, чтобы он всегда возвращал Integer, либо изменить код VB, чтобы он мог обрабатывать нули.   -  person jmcilhinney    schedule 17.05.2018
comment
Между прочим, если значение уже является Integer, но просто помещено в коробку, т. е. предоставлено через ссылку Object, тогда CInt будет более подходящим, чем Convert.ToInt32, так как фактическое преобразование не требуется; просто литье.   -  person jmcilhinney    schedule 17.05.2018
comment
Если dr.HasRows = True, то Если dr.IsDBNull(0) = False, тогда dr.Close() cv = Convert.ToInt32(cmd2.ExecuteScalar())   -  person DIANA ROSE ARNAIZ    schedule 17.05.2018
comment
я пересмотрел его. но в остальной части кода он не вернет значение   -  person DIANA ROSE ARNAIZ    schedule 17.05.2018
comment
Вы продолжаете говорить, что использовали dr.HasRows, но я не вижу, чтобы вы использовали DataReader в своем коде. Вы используете ExecuteScalar(). Ну, судя по вашему предыдущему комментарию, вы используете DataReader перед вызовом .ExecuteScalar(). Если вы делаете это только для проверки наличия строк, вам не нужно этого делать. Проверьте мой ответ ниже.   -  person 41686d6564    schedule 17.05.2018


Ответы (2)


Простой способ обойти эту проблему — проверить, является ли возвращаемое значение DBNull:

Dim cv As Integer
Dim queryResult = cmd2.ExecuteScalar()
If IsDBNull(queryResult) Then
    ' No matching records. Do something about it.
Else
    cv = DirectCast(queryResult, Integer)
End If
person 41686d6564    schedule 17.05.2018

Можете ли вы написать для С# executescalar:

SqlCommand smd = new SqlCommand("Select Min(GidenEvrakSira) FROM GidenEvrak Where UserID is null", con);

minum = Convert.ToInt32(smd.ExecuteScalar());
person Kubilay Özyalçın    schedule 08.09.2019