VB.NET MS Access:即使副本为0或-1,也会记录数据

VB.NET MS Access:即使副本为0或-1,也会记录数据,vb.net,ms-access,Vb.net,Ms Access,我正在使用VB.NET与.accdb链接开发图书馆管理系统,并希望在此代码中添加If条件,因此,当用户单击“借阅”按钮且所选的可用图书副本为0时,将显示一个错误,并且不会将记录添加到数据库中 试试看 Dim ds2作为新数据集 Dim da2作为新的OLEDB数据适配器(“从书本中选择副本”,con) 如果da2.填充(ds2),则 将cb1调为OLEDB命令 cb1=新OleDbCommand(“更新图书集拷贝数=拷贝数-1,其中ISBN=@ISBN”,con) cb1.Parameters

我正在使用VB.NET与.accdb链接开发图书馆管理系统,并希望在此代码中添加If条件,因此,当用户单击“借阅”按钮且所选的可用图书副本为0时,将显示一个错误,并且不会将记录添加到数据库中

试试看
Dim ds2作为新数据集
Dim da2作为新的OLEDB数据适配器(“从书本中选择副本”,con)
如果da2.填充(ds2),则
将cb1调为OLEDB命令
cb1=新OleDbCommand(“更新图书集拷贝数=拷贝数-1,其中ISBN=@ISBN”,con)
cb1.Parameters.Add(“ISBN”,OleDbType.Decimal).Value=TextBox1.Text
cb1.ExecuteNonQuery()
MessageBox.Show(“图书借用成功!”)
其他的
MsgBox(MsgBoxStyle.Critical,“Oledb错误”)
如果结束
特例
MsgBox(例如消息)

结束尝试
您需要选择单个数据段,即单个ISBN的可用拷贝数。您可以使用
.ExecuteScalar
来执行此操作。如果拷贝数大于0,则减小该字段。请注意,我们使用相同的命令、连接和参数

Private ConStr As String = "Your connection string"

Private Function CheckCopies(isbn As Decimal) As String
    Dim message As String
    Dim sql = "Select Copies From Book Where ISBN = @ISB;"
    Dim AvailableCopies As Integer
    Using cmd As New OleDbCommand(sql, New OleDbConnection(ConStr))
        cmd.Parameters.Add("@ISB", OleDbType.Decimal).Value = isbn
        cmd.Connection.Open()
        AvailableCopies = CInt(cmd.ExecuteScalar)
        If AvailableCopies > 0 Then
            cmd.CommandText = "UPDATE Book SET Copies=Copies-1 WHERE ISBN=@ISB;"
            cmd.ExecuteNonQuery()
            message = "Check out complete."
        Else
            message = "No copies available."
        End If
    End Using
    Return message
End Function

两种选择。首先,do then是一个查询,用于查找在更新之前有多少本书可用(顺便说一句,您已经这样做了)。第二个选项,excetenonqurey返回受影响的记录数,检查并根据需要处理异常
da2。Fill(ds2)
不返回布尔值,因此它不能在
If
中使用。我不知道您尝试使用的MsgBox重载是什么,但
MsgBox(MsgBoxStyle.Critical,“Oledb错误”)
与任何人都不匹配。@jmchilinney我们“人”的思维水平与你想象的不一样,许多人在这里得到了帮助,因为“这不是它的工作方式”。令人惊讶的是,它起了作用。很高兴我和你的思维水平不一样。