【问题标题】:Data Mismatch Error in VB.net SQL statementVB.net SQL 语句中的数据不匹配错误
【发布时间】:2018-09-27 17:52:38
【问题描述】:

我有这个代码:

Protected Sub unlikebtn_Click(sender As Object, e As EventArgs) Handles unlikebtn.Click
    Dim strSQL As String
    Dim MemberDataConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source=" & Server.MapPath("database/Database.mdb"))
    Dim MemberCommand As New OleDbCommand(strSQL, MemberDataConn)
    MemberDataConn.Open()

    MemberCommand.Connection = MemberDataConn
    MemberCommand.CommandText = "DELETE FROM LIKES WHERE  user_id ='" & Session("user_id") & "' AND post_id = '" & Session("post_id") & "'"
    MemberCommand.ExecuteNonQuery()
    MemberDataConn.Close()


    likebtn.Visible = True
    unlikebtn.Visible = False
End Sub

当我运行它时,.ExecuteNonQuery() 出现错误:

System.Data.OleDb.OleDbException: '标准表达式中的数据类型不匹配。

我认为问题不在于数据库中的数据类型...

【问题讨论】:

  • 始终使用 SQL 参数。如果帖子 ID(或用户 ID)是数字,则您将其强制为文本。并且请注意标签 - 它不能是 vba 和 VB.NET

标签: sql vb.net visual-studio ms-access vba


【解决方案1】:

将值连接到 SQL 命令中(几乎)总是一个坏主意。相反,您应该使用 SQL 参数 来传递值。

此外,某些类的实例(例如 OleDbConnection)使用非托管资源,您必须告诉 .NET Framework 在您使用完这些资源后释放它们。您可以自己调用.Dispose() 方法或使用Using 构造。后者更整洁,因为即使出现问题,它也会负责处理。

所以你的代码可能看起来像:

Dim strSQL As String = "DELETE FROM LIKES WHERE user_id = ? AND post_id = ?"

Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source=" & Server.MapPath("database/Database.mdb"))
    Using sqlCmd As New OleDbCommand(strSQL, conn)

        'TODO: set the OleDbType to match the columns in the database '
        sqlCmd.Parameters.Add(New OleDbParameter With {
                              .ParameterName = "@UserId",
                              .OleDbType = OleDbType.VarWChar,
                              .Size = 32,
                              .Value = CStr(Session("user_id"))})

        sqlCmd.Parameters.Add(New OleDbParameter With {
                              .ParameterName = "@PostId",
                              .OleDbType = OleDbType.Integer,
                              .Value = CInt(Session("post_id"))})

        conn.Open()
        sqlCmd.ExecuteNonQuery()
        conn.Close()

    End Using
End Using

likebtn.Visible = True
unlikebtn.Visible = False

SQL 命令中的?s 是参数的占位符。不使用参数名称,但它可以更容易地查看代码中的内容。因为不使用名称,所以必须按照与相应占位符相同的顺序添加参数。您需要调整参数的类型(以及字符串的大小)以匹配数据库中的列类型。

顺便说一句,如果站点要在 IIS 下运行,那么您可以将数据库放在 App_Data 目录中,因为默认情况下,那里的任何内容都不会提供给客户端。此外,SQL Server 是更适合多用户环境的数据库 - 您可以免费使用 Express 版本。

【讨论】:

  • 嗨!谢谢你这个超级有用的评论!它完美地工作!我本来很想使用 SQL Server,但不幸的是,这个特定项目无法使用它!
猜你喜欢
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多