【问题标题】:Checking if Column is empty but i am receiving Error.(Vb.net)检查列是否为空但我收到错误。(Vb.net)
【发布时间】:2020-05-12 12:11:59
【问题描述】:

我试图在插入日期之前检查一列是否为空,但我收到一个错误,我不知道如何解决它。我读到了ExecuteScalar(),但在我的情况下它没有帮助。

代码:

Dim sql As String = "UPDATE [TA-Arbeitszeit] SET Ende = @ende WHERE Personal_nr = @Personal_nr AND Arbeitstag = @Arbeitstag"
Dim sql2 As String = "SELECT * FROM [TA-Arbeitszeit] WHERE Personal_nr = @Personal_Nr AND Arbeitstag = @Arbeitstag"

Using conn2 As New OleDbConnection(connectionString),
    cmd2 As New OleDbCommand(sql2, conn2)
    conn2.Open()
    cmd2.Parameters.Add("@Personal_nr", OleDbType.VarChar).Value = tbxUserInput.Text.Trim()
    cmd2.Parameters.Add("@Arbeitstag", OleDbType.VarChar).Value = DateTime.Now.ToString("d")

    Dim ende As String

    Using reader0 As OleDbDataReader = cmd2.ExecuteReader()
        reader0.Read()
        ende = reader0(3)
    End Using

    If String.IsNullOrEmpty(ende) Then
        Using conn As New OleDbConnection(connectionString),
                cmd As New OleDbCommand(sql, conn)
            conn.Open()
            cmd.Parameters.Add("@ende", OleDbType.VarChar).Value = DateTime.Now.ToString("G")
            cmd.Parameters.Add("@Personal_nr", OleDbType.VarChar).Value = tbxUserInput.Text.Trim()
            cmd.Parameters.Add("@Arbeitstag", OleDbType.VarChar).Value = DateTime.Now.ToString("d")
            Dim icount As Integer = cmd.ExecuteNonQuery

        End Using

        frmGreetings.Label1.Text = eveninggreetingsAray()
        frmGreetings.Label2.Text = "Sie haben Ihren Arbeitstag beendet."
        frmGreetings.ShowDialog()
        tbxUserInput.Select()
    Else
        frmNotificationBox.Label1.Text = "Ihren Arbeitstag ist schon beendet!"
        frmNotificationBox.ShowDialog()
        tbxUserInput.Select()
    End If
End Using

【问题讨论】:

  • 只有在数据库中的值为 null 时才更新Ende
  • Re“我收到一个错误”,您收到的具体错误是什么?哪条线?
  • 我想在为空时更新 Ende。如果已经有一些东西我不想更新它并向用户说该列已填充​​。错误出现在 ende=reader0(3) 行。
  • 我们不得不问这个问题有点不可思议,别介意两次,但错误信息是什么?

标签: sql vb.net visual-studio oledb


【解决方案1】:

我认为 sql2 中存在逻辑错误。现有记录怎么会有现在的日期?也许这会在插入时立即进行检查。在这种情况下,为什么不将 ende 设为必填字段?

不要从服务器中提取额外的数据。您只关心此子中的 Ende,因此这是唯一要检索的字段。然后你可以使用 .ExecuteScalar。我认为 .ToString 可能会解决 null 问题。

将 Connection.Open 移到 .Execute 之前

Private connectionString As String = "Your connection string"
Private Sub OpCode()
    'How can Arbeitstag be Now in an existing record?
    'Dim sql2 As String = "SELECT * FROM [TA-Arbeitszeit] WHERE Personal_nr = @Personal_Nr AND Arbeitstag = @Arbeitstag"
    Dim sql2 As String = "Select Ende From [TA-Arbeitszeit] WHERE Personal_nr = @Personal_Nr AND Arbeitstag = @Arbeitstag;"
    Dim ende As String
    Using conn2 As New OleDbConnection(connectionString),
        cmd2 As New OleDbCommand(sql2, conn2)

        cmd2.Parameters.Add("@Personal_nr", OleDbType.VarChar).Value = tbxUserInput.Text.Trim()
        'I don't quite see how an existing record can have today's date
        cmd2.Parameters.Add("@Arbeitstag", OleDbType.VarChar).Value = DateTime.Now.ToString("d")

        conn2.Open() 'Move the .Open to directly befor the .Execute
        ende = cmd2.ExecuteScalar.ToString
    End Using

    If String.IsNullOrEmpty(ende) Then
        'Move this closer to where is is used
        Dim sql As String = "UPDATE [TA-Arbeitszeit] SET Ende = @ende WHERE Personal_nr = @Personal_nr AND Arbeitstag = @Arbeitstag"

        Using conn As New OleDbConnection(connectionString),
                cmd As New OleDbCommand(sql, conn)
            conn.Open()
            cmd.Parameters.Add("@ende", OleDbType.VarChar).Value = DateTime.Now.ToString("G")
            cmd.Parameters.Add("@Personal_nr", OleDbType.VarChar).Value = tbxUserInput.Text.Trim()
            cmd.Parameters.Add("@Arbeitstag", OleDbType.VarChar).Value = DateTime.Now.ToString("d")
            Dim icount As Integer = cmd.ExecuteNonQuery
        End Using

        frmGreetings.Label1.Text = eveninggreetingsAray()
        frmGreetings.Label2.Text = "Sie haben Ihren Arbeitstag beendet."
        frmGreetings.ShowDialog()
        tbxUserInput.Select()
    Else
        frmNotificationBox.Label1.Text = "Ihren Arbeitstag ist schon beendet!"
        frmNotificationBox.ShowDialog()
        tbxUserInput.Select()
    End If

End Sub

【讨论】:

  • 好吧,我想检查他们是否已经注销。我正在尝试用他们的个人号码检查今天的一天。 Ende 意味着在我们的数据库中结束,我想看看他们是否已经结束了他们的工作日。
  • 它起作用了,我从没想过只拿 Ende 列并检查它。谢谢。
猜你喜欢
  • 2022-06-20
  • 1970-01-01
  • 2020-02-04
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 2014-07-16
相关资源
最近更新 更多