刷新组合框列表时保存的图像文件显示两次

saved image file showing twice when I refresh combobox list

所以我在 visual basic 中使用 blob,并将图像文件保存到数据库中。当我保存它们时,它们的 name.jpg 显示在组合框中,但是当我保存另一张图片并刷新列表时,前一张图片的名称显示两次。我不确定我是怎么做到的。我是新手,不要太看不起我!

当我的表单上的按钮被点击时:

Private Sub btnSaveBlob_Click(sender As Object, e As EventArgs) Handles btnSaveBlob.Click
    SaveBlobToDatabase()
    refreshBlobList()
End Sub

我的方法:

Private Sub SaveBlobToDatabase()

    GetCompleteFilePath()

    Dim BLOB() As Byte

    Dim FileStream As New IO.FileStream _
    (CompleteFilePath, IO.FileMode.Open, IO.FileAccess.Read)

    Dim reader As New IO.BinaryReader(FileStream)

    BLOB = reader.ReadBytes(CInt(My.Computer.FileSystem.GetFileInfo(CompleteFilePath).Length))
    FileStream.Close()
    reader.Close()

    Dim SaveDocCommand As New SqlCommand
    SaveDocCommand.Connection = conn
    SaveDocCommand.CommandText = "INSERT INTO DocumentStorage" &
    "(FileName, DocumentFile)" &
    "VALUES (@FileName, @DocumentFile)"

    Dim FileNameParameter As New SqlParameter("@FileName", SqlDbType.NChar)
    Dim DocumentFileParameter As New SqlParameter("@DocumentFile", SqlDbType.Binary)
    SaveDocCommand.Parameters.Add(FileNameParameter)
    SaveDocCommand.Parameters.Add(DocumentFileParameter)

    FileNameParameter.Value =
    CompleteFilePath.Substring(CompleteFilePath.LastIndexOf("\") + 1)

    DocumentFileParameter.Value = BLOB

    Try
        SaveDocCommand.Connection.Open()
        SaveDocCommand.ExecuteNonQuery()
        MessageBox.Show(FileNameParameter.Value.ToString &
        "saved to database.", "BLOB Saved!", MessageBoxButtons.OK,
        MessageBoxIcon.Information)
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Save Failed",
        MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
        SaveDocCommand.Connection.Close()
    End Try
End Sub


Private Sub refreshBlobList()
        Dim GetBlobListCommand As New SqlCommand("SELECT FileName FROM DocumentStorage", conn)
        Dim reader As SqlDataReader
        GetBlobListCommand.Connection.Open()
        reader = GetBlobListCommand.ExecuteReader
        While reader.Read
            lstBlob.Items.Add(reader(0))
        End While
        reader.Close()
        GetBlobListCommand.Connection.Close()
        If lstBlob.Items.Count > 0 Then
            lstBlob.SelectedIndex = 0
        End If
End Sub

.net 中显示 .Dispose 方法的对象应该被释放。他们有非托管代码,需要适当地发布东西。 Connections、Commands、Streams 和 Readers 属于这一组。幸运的是,.net 提供了 Using...End Using 块,即使出现错误也可以为我们处理这个问题。因此,这些对象应保留在使用它们的方法的本地。

方法应尽可能执行单一任务。我提取了将字节数组创建到单独函数的代码。我还将数据访问代码与用户界面代码分开。您可能希望将数据访问代码放在单独的 class 中。例如,如果您想更改为网络应用程序,这会派上用场。

在数据访问代码中:

您可以将连接字符串直接传递给连接的构造函数。同样,将 CommandText 和 Connection 直接传递给命令的构造函数。 .Parameters 集合的 .Add 方法将从传递给它的名称和数据类型创建一个新参数。您也可以在同一行设置值。

Private ConStr As String = "Your connection string"

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim RowsAdded As Integer
    Try
        RowsAdded = SaveBlobToDatabase()
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Save Failed", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
    If RowsAdded = 1 Then
        MessageBox.Show("Saved to database.", "BLOB Saved!", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End If
End Sub

Private Function SaveBlobToDatabase() As Integer
    Dim RowsAdded As Integer
    Dim CompleteFilePath As String = GetCompleteFilePath()
    Using conn As New SqlConnection(ConStr),
            SaveCommand As New SqlCommand("INSERT INTO DocumentStorage(FileName, DocumentFile) VALUES(@FileName, @DocumentFile);", conn)
        SaveCommand.Parameters.Add("@FileName", SqlDbType.NChar).Value = Path.GetFileName(CompleteFilePath) 'Requires Imports System.IO
        SaveCommand.Parameters.Add("@DocumentFile", SqlDbType.Binary).Value = GetByteArrayFromFile(CompleteFilePath)
        conn.Open()
        RowsAdded = SaveCommand.ExecuteNonQuery()
    End Using
    Return RowsAdded
End Function

Private Function GetByteArrayFromFile(FullPath As String) As Byte()
    Dim Blob() As Byte
    Using FileStream As New IO.FileStream(FullPath, IO.FileMode.Open, IO.FileAccess.Read),
            reader As New IO.BinaryReader(FileStream)
        Blob = reader.ReadBytes(CInt(My.Computer.FileSystem.GetFileInfo(FullPath).Length))
    End Using
    Return Blob
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    lstBlob.Items.Clear()
    lstBlob.DataSource = refreshBlobList()
    lstBlob.DisplayMember = "FileName"
    If lstBlob.Items.Count > 0 Then
        lstBlob.SelectedIndex = 0
    End If
End Sub

Private Function refreshBlobList() As DataTable
    Dim dt As New DataTable
    Using conn As New SqlConnection(ConStr),
        GetBlobListCommand As New SqlCommand("SELECT FileName FROM DocumentStorage", conn)
        conn.Open()
        dt.Load(GetBlobListCommand.ExecuteReader)
    End Using
    Return dt
End Function