【问题标题】:OleDbException was unhandled syntax error from clauseOleDbException 是来自子句的未处理语法错误
【发布时间】:2019-07-30 05:43:40
【问题描述】:
Imports System.Data.OleDb
Imports System.Data


Public Class Form1
    Dim connection As New OleDbConnection(My.Settings.dataConnectionString)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If TextBox1.Text = Nothing Or TextBox2.Text = Nothing Then
            MsgBox("Enter credentials ", MsgBoxStyle.Exclamation)
        Else
            If connection.State = ConnectionState.Closed Then
                connection.Open()
            End If
            Dim cmd As New OleDbCommand("select count (*) from log in where last name=? and ID=?", connection)
            cmd.Parameters.AddWithValue("@1", OleDbType.VarChar).Value = TextBox1.Text
            cmd.Parameters.AddWithValue("@2", OleDbType.VarChar).Value = TextBox2.Text
            Dim count = Convert.ToInt64(cmd.ExecuteScalar())


            If (count > 0) Then
                MsgBox("log in succeed", MsgBoxStyle.Information)
            Else
                MsgBox("account not found check credentials", MsgBoxStyle.Critical)


            End If

        End If


    End Sub
End Class

【问题讨论】:

  • Dim count = Convert.ToInt64(cmd.ExecuteScalar()) 错误
  • 顺便说一句,Int64 是 vb.net 中的 Long。 CLng 应该可以工作。

标签: vb.net


【解决方案1】:

ExecuteScalar 返回 int 但在对象中。您需要将其更改为 int 然后加倍。

 double count= (double)(int)cmdCheck.ExecuteScalar();

【讨论】:

  • 我不知道 Count 将返回双精度的任何数据库。此外,这是一个 vb.net 问题,而不是 C#。
【解决方案2】:

在您的 SELECT 语句中,在 FROM 之后和 WHERE 子句之前,您有两个词“登录”。如果这是您的表名,则必须将其括在 sql-server 的括号中

Dim cmd As New OleDbCommand("select count (*) from [log in] where last name=? and ID=?", connection)

【讨论】:

    【解决方案3】:

    将您的数据库对象保存在使用它们的本地位置,以便您可以控制它们何时关闭和处置。 Using...End 即使出现错误,使用块也会为您执行此操作。

    请注意,我们在 Using 块之外声明了 count。它是在块内声明的,它在结束使用后将不可见。

    我们仅在连接关闭并由 End Using 处理后才显示消息框。连接是有限的资源,应在最后一刻打开并尽快关闭。

    我猜是一个问题。一看到ID,我就想到了数字类型。检查您的数据库以查看它是什么类型。如果它是一个整数,那么您正在传递一个字符串值。类型不匹配!

    在 sql 语句中,您需要用方括号 [ ] 中的空格将标识符括起来。语法错误!

    另一个问题是您对.AddWithValue 的使用。第二个参数是一个作为值的对象。您将 .Add(String, OleDbType).Value 方法与 .AddWithValue 方法混合在一起。

    我很高兴您使用参数,这无疑是最佳实践。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If TextBox1.Text = Nothing Or TextBox2.Text = Nothing Then
            MsgBox("Enter credentials ", MsgBoxStyle.Exclamation)
            Return
        End If
        Dim count As Long
        Using Connection As New OleDbConnection(My.Settings.dataConnectionString)
            Using cmd As New OleDbCommand("select count (*) from [log in] where [last name]=@LName and ID=@ID", Connection)
                cmd.Parameters.Add("@LName", OleDbType.VarChar).Value = TextBox1.Text
                cmd.Parameters.Add("@ID", OleDbType.Integer).Value = CInt(TextBox2.Text)
                Connection.Open()
                count = CLng(cmd.ExecuteScalar())
            End Using
        End Using
        If count > 0 Then
            MsgBox("log in succeed", MsgBoxStyle.Information)
        Else
            MsgBox("account not found check credentials", MsgBoxStyle.Critical)
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      相关资源
      最近更新 更多