Как проверить, возвращает ли запрос нулевое значение, и добавить его в текст метки? - PullRequest
1 голос
/ 04 апреля 2019

Я создаю новое приложение в Windows Forms (vb.net), которое проверяет, есть ли какие-либо записи, добавляемые ежедневно в базу данных SQL, на основе некоторых критериев.Проблема в том, что я не могу понять, как отобразить какое-либо сообщение в поле метки, если запрос возвращает нулевое значение.

Public Sub LoadUser2()
    Dim dt As New DataTable()
    Dim Con = New SqlConnection("Server=my server;database=My db;Integrated Security = True")
    Con.Open()
    Dim cmd As SqlCommand = New SqlCommand("select sum(Minutes)/60 as 'Ore Logate' from [dbo].[UserActivity]
                                            where team = 'Xaver' and username like '%alnecula%' and Convert(date,DateCreated) = Convert(date,getdate())", Con)
    Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
    da.SelectCommand = cmd
    da.Fill(dt)

    If dt.Rows.Count > 0 Then
        Txtgvlad.Text = "Logged Hours: " & dt.Rows(0)("Username").ToString
    Else
        Txtgvlad.Text = "You haven't logged any hours"
    End If
    Con.Close()
End Sub

Поэтому я хочу отобразить количество зарегистрированных часов, если естьAny, иначе отображает строковое сообщение, информирующее пользователя о том, что часы не зарегистрированы.В настоящее время код показывает мне Logged Hours:, если есть нулевой результат.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Проблема с вашим реальным кодом заключается в том, что даже если условие where не возвращает ни одной записи, в вашей таблице все еще есть строка, которая содержит NULL.Так что твой тест всегда верный.Вы можете проверить это, просто скопировав ваш запрос в Sql Server Management Studio и запустив его.

Вместо этого вы можете использовать ExecuteScalar для получения результата

Dim cmd As SqlCommand = New SqlCommand("select sum(Minutes)/60 as 'Ore Logate' 
                                        from [dbo].[UserActivity]
                                        where team = 'Xaver'  
                                          and username like '%alnecula%' 
                                          and Convert(date,DateCreated) = Convert(date,getdate())", Con)
Dim result = cmd.ExecuteScalar()
If Not IsDBNull(result) Then 
    Txtgvlad.Text = "Logged Hours: " & result.ToString
Else
    Txtgvlad.Text = "You haven't logged any hours"
End If

Также учтите, что этот запрос может вернуть ноль (но не NULL), и в этом случае условие IF будет истинным.Если вы хотите написать ложное сообщение даже в случае возврата нуля, вам нужно добавить условие AndAlso в If

If Not IsDBNull(result) AndAlso result.ToString <> "0" Then 
1 голос
/ 04 апреля 2019

Хороший способ сделать это - использовать sqldatareader. так что в основном вы делаете свой Sp как обычно, но выполняете его с помощью средства чтения, тогда вы используете .hasrows в операторе if. так, например, с тем, что вы предоставили

Public Sub LoadUser2()

    Dim Con = New SqlConnection("Server=my server;database=My db;Integrated Security = True")
    Con.Open()
    Dim cmd As new SqlCommand = New SqlCommand("select sum(Minutes)/60 as 'Ore Logate' from [dbo].[UserActivity]
                                        where team = 'Xaver' and username like '%alnecula%' and Convert(date,DateCreated) = Convert(date,getdate())", Con)


   using RDR = cmd.executeReader
    if RDR.has rows
       IF RDR("YourColumnName").tostring() = "" then
          Txtgvlad.Text = "You haven't logged any hours"
       else
        Txtgvlad.Text = "Logged Hours: " & RDR("Username").ToString

    else
        Txtgvlad.Text = "You haven't logged any hours"
    end if
  end using


    Con.Close()
End Sub

Причина, по которой ваш исходный код все еще возвращает, что у него есть строки, может быть в том, что он возвращает строку, а просто пустые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...