Vb.net无法保存,被其他用户锁定

时间:2014-11-06 04:52:19

标签: vb.net

我遇到的问题是,当我尝试更新图片时,我点击保存错误消息说"无法保存,被其他用户锁定。哪里出错了?有时我可以更新,但有时不会,为什么? 我意识到我必须打开Access文件并关闭它然后才能工作。 错误行是cmd.ExecuteNonQuery()。

    Dim con = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source =..\room.accdb")

    Dim ms As New MemoryStream
    Dim arrimg As Byte()
    Me.PictureBox1.Image.Save(ms, Imaging.ImageFormat.Png)
    arrimg = ms.GetBuffer()
    ms.Read(arrimg, 0, ms.Length)

    Dim sql As String = "UPDATE Userss SET profilepicture =@profilepicture WHERE studentid=" & Form1.txtStuID.Text & ";"
    Dim cmd As New OleDbCommand
    con.open()
    cmd = New OleDbCommand(sql, con)
    Dim photo As OleDbParameter = New OleDbParameter("@profilepicture", SqlDbType.Image)
    photo.Value = arrimg
    cmd.Parameters.Add(photo)
    cmd.ExecuteNonQuery()
    MessageBox.Show("Profile picture saved.")
    con.close()

2 个答案:

答案 0 :(得分:0)

被其他用户锁定' MS Access是一个模糊的消息,因为它可能是由于几个不同的原因。它不会被特定的原因混淆(例如总是意味着表锁)。它可以是*或它可以是* .ldb文件本身,也可以是表单/表格设计甚至权限相关。但是,在您的方案中,您正在获取它,因为您已经如上所述在MS Access上打开了数据库。打开db / tables,通常会锁定表。

当您打开记录或表单(或表结构)未以最佳方式设计或有人打开对文件夹和文件没有读写权限的mdb / accdb时。此错误与* .mdb / accdb文件关联的* .ldb文件有关,该文件实际上是'锁定'并导致错误。

可以考虑一些选项,例如;

  • 在更新语句中使用NO LOCK,但这可能不是最好的。
  • 确保您的所有连接在使用后都妥善处理。
  • 使用using块来表示实现IDisposable的对象。
  • 您还可以阅读DEADLOCKS,这可能有助于避免锁定

答案 1 :(得分:0)

这应该有效:

    Dim arrimg As Byte()
    Using ms As New MemoryStream
        Me.PictureBox1.Image.Save(ms, Imaging.ImageFormat.Png)
        arrimg = ms.GetBuffer()
        ms.Read(arrimg, 0, ms.Length)
    End Using

    Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source =..\room.accdb")
        con.Open()
        Using cmd As New OleDbCommand("UPDATE Userss SET profilepicture = @profilepicture WHERE studentid = @studentId;", con)
            Dim studentID As New OleDbParameter("@studentId", Form1.txtStuID.Text)
            cmd.Parameters.Add(studentID)
            Dim photo As New OleDbParameter("@profilepicture", SqlDbType.Image)
            photo.Value = arrimg
            cmd.Parameters.Add(photo)
            cmd.ExecuteNonQuery()
            MessageBox.Show("Profile picture saved.")
        End Using
        con.Close()
    End Using

从代码中我可以看到你混合演示和数据访问逻辑,你应该将每个功能限制为DAL方法,这样就可以更容易地找到数据库连接保持打开的位置。

使用这样的Using,您可以轻松避免手动处理对象,即使有例外,也可以确保连接将被关闭。

始终使用参数并检查一次性对象(如MemoryStream)。