我遇到的问题是,当我尝试更新图片时,我点击保存错误消息说"无法保存,被其他用户锁定。哪里出错了?有时我可以更新,但有时不会,为什么? 我意识到我必须打开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()
答案 0 :(得分:0)
被其他用户锁定' MS Access是一个模糊的消息,因为它可能是由于几个不同的原因。它不会被特定的原因混淆(例如总是意味着表锁)。它可以是*或它可以是* .ldb文件本身,也可以是表单/表格设计甚至权限相关。但是,在您的方案中,您正在获取它,因为您已经如上所述在MS Access上打开了数据库。打开db / tables,通常会锁定表。
当您打开记录或表单(或表结构)未以最佳方式设计或有人打开对文件夹和文件没有读写权限的mdb / accdb时。此错误与* .mdb / accdb文件关联的* .ldb文件有关,该文件实际上是'锁定'并导致错误。
可以考虑一些选项,例如;
NO LOCK
,但这可能不是最好的。 using
块来表示实现IDisposable
的对象。答案 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
)。