2015-04-09 2 views
-1

При использовании приведенного ниже кода отображается одна ошибка. ошибка: Operator '=' is not defined for type 'DBNull' and string "True". Помогите найти правильное решение. Спасибо.Оператор '=' не определен для типа 'DBNull' и строки "True". VB.net

Код:

cmd1.CommandText = "select * FROM attendance where academic_year='" & yearTextBox.Text & "' and School_Name='" & courseDropDownList.Text & "' and Class='" & semesterDropDownList.Text & "' and batch='" & batchDropDownList.Text & "' and hour='" & DropDownList6.Text & "' and date_present='" & TextBox1.Text & "'" 
sdr1 = cmd1.ExecuteReader 
While sdr1.Read 
    dr("student_name") = sdr1("student_name") 
    dr("rollnumber") = sdr1("roll_number") 
    dr("comment") = sdr1("comment") 
Dim status As String = "" 
    If sdr1("present") = "True" Then // ***Error popup here*** 
    status = "Present" 
    ElseIf sdr1("Absent") = "True" Then 
    status = "Absent" 
    ElseIf sdr1("od") = "True" Then 
    status = "OD" 
    End If 
    If sdr1("late") = "True" Then 
    dr("status_late") = ", Latecomer" 
    End If 
    dr("status") = status 
    dt.Rows.Add(dr) 
    dr = dt.NewRow 
End While 
sdr1.Close() 
+2

перерыв и посмотреть, какие значения приходят, это 'sdr1 (« Present »)' .probably, если его значение null, используйте '.tostring'. –

+2

или проверьте «Isdbnull» перед использованием оператора сравнения. –

ответ

1

это означает, что один из возвращенного значения в БД NULL, поэтому вы получаете значение типа DBNull. вы должны сначала проверить, является ли полученное значение NOT NULL, используя .IsDBNull, а затем вы можете сравнить его, используя =.

3

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

select 
    student_name, 
    roll_number, 
    comment, 
    CASE 
     WHEN present='true' THEN 'present' 
     WHEN absent ='true' THEN 'absent' 
     WHEN od='true' THEN 'od' 
    END as status, 
    CASE 
     WHEN late ='true' THEN ', Latecomer' 
    END as status_late 
FROM attendance where [email protected] 

А также переключиться на использование parameterized запросов на поставку @year, а не построения строк вместе.

Если вы сделаете выше изменения, вы можете также быть в состоянии перейти непосредственно filling ваш DataTable с результирующим набором, а не с помощью ExecuteReader и перекручивания и копирования результатов в поперечнике.

+0

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

1

Собственно, при чтении данных из базы данных вы должны убедиться, что считанное значение является нулевым или обязательным.

Для значения Nullable вы не можете установить его в строку, например. Итак, лучший способ чтения данных из базы данных, перед установкой значения необходимо проверить на IsDBNull следующим образом;

If (sdr1("present") IsNot DBNull.Value) AndAlso sdr1("present") = "True" Then 
    status = "Present" 
ElseIf (sdr1("Absent") IsNot DBNull.Value) AndAlso sdr1("Absent") = "True" Then 
    status = "Absent" 
ElseIf (sdr1("od") IsNot DBNull.Value) AndAlso sdr1("od") = "True" Then 
    status = "OD" 
End If 

If (sdr1("late") IsNot DBNull.Value) AndAlso sdr1("late") = "True" Then 
    dr("status_late") = ", Latecomer" 
End If 
Смежные вопросы