1

在下面的代码中,它是一个用于OLEDB连接的“删除”按钮。我的数据库表名是tblinformation.

顺便说一句,错误显示:

Data type mismatch in criteria expression. `-Microsoft JET DATABASE ENGINE`, and it was in a form of msgbox..



Imports System.Data.OleDb
Imports System.String
Public Class frmbookinfo
Dim cnn As New OleDb.OleDbConnection


Dim Str As String
    If CheckId() = False Then
        MsgBox("Id : Integer Value Required!!!")
        Exit Sub
    End If
    Try
        Str = "delete from tblinformation where bcode="
        Str += txtbookcode.Text.Trim
        Con.Open()
        Cmd = New OleDbCommand(Str, Con)
        Cmd.ExecuteNonQuery()
        Dst.clear()
        Dad = New OleDbDataAdapter("SELECT * FROM tblinformation ORDER BY bcode", Con)
        Dad.Fill(Dst, "tblinformation")
        MsgBox("Record deleted successfully...")
        If CurrentRow > 0 Then
            CurrentRow -= 1
            ShowData(CurrentRow)
        End If
        Con.Close()
    Catch ex As Exception
        MessageBox.Show("Could Not delete Record!!!")
        MsgBox(ex.Message & " -  " & ex.Source)
        Con.Close()
    End Try
4

1 回答 1

1

可能您bcode在数据库中的字段是文本类型。
您使用字符串连接来构建命令文本,如果您未能正确处理您的值,这将无济于事。

而是使用参数化查询并让任务正确解析您的参数到数据库框架代码

    Str = "delete from tblinformation where bcode=?"
    Con.Open()
    Cmd = New OleDbCommand(Str, Con)
    Cmd.Parameters.AddWithValue("@p1", txtbookcode.Text.Trim)
    Cmd.ExecuteNonQuery()

现在您的 sql 命令包含一个参数占位符 (?),并且在参数集合中分配了正确的参数值。框架代码正确处理此参数

编辑如果您的bcode字段是文本字段,则不能以这种方式构建命令。您应该在单引号之间封装您的值。像这样的东西。

IT WORKS BUT IT IS WRONG - VERY WRONG -
Str = "delete from tblinformation where bcode='" & txtbookcode.Text.Trim & "'"

但这从一开始就是错误的。

  • 首先 - 如果您的 txtbookcode 包含单引号,则整个命令文本将变为无效,您会得到一个Syntax Error
  • 第二 - 字符串连接不好,因为您不能信任您的用户。如果它输入一些恶意文本,您可能会遇到Sql Injection 问题

所以,我真的建议您使用第一个示例中说明的参数化查询方法

于 2013-04-15T08:08:20.090 回答