使用SqlConnection的vb.net不';我不能将该文件从使用中释放出来

使用SqlConnection的vb.net不';我不能将该文件从使用中释放出来,vb.net,sqlconnection,Vb.net,Sqlconnection,我正在处理一个本地.mdf文件,并对数据库执行一些查询,我正在使用块来确保正确处理SqlConnection和SqlReader 然后我尝试读取文件的数据以生成文件的MD5哈希,但它表示该文件仍在使用中 代码不是最干净的,这是我第一次在VB.NET应用程序中使用Sql SQL插入: Dim finalW As String = "" Dim finalO() As String Dim currentcounter As Integer = 0 For Each Dir As String In

我正在处理一个本地.mdf文件,并对数据库执行一些查询,我正在使用块来确保正确处理SqlConnection和SqlReader

然后我尝试读取文件的数据以生成文件的MD5哈希,但它表示该文件仍在使用中

代码不是最干净的,这是我第一次在VB.NET应用程序中使用Sql

SQL插入:

Dim finalW As String = ""
Dim finalO() As String
Dim currentcounter As Integer = 0
For Each Dir As String In System.IO.Directory.GetDirectories(Pathfinder)
    Dim dirInfo As New System.IO.DirectoryInfo(Dir)
    Dim temp As New List(Of String)
    For Each currentFile In Directory.GetFiles(Pathfinder & "\" & dirInfo.Name & "\", "*.png", SearchOption.TopDirectoryOnly)
        temp.Add(Path.GetFileName(currentFile))
    Next
    If temp.Count <> 0 Then
        finalW = temp.Find(AddressOf GetNewIcon)
        finalO = temp.FindAll(AddressOf GetOldIcon).ToArray
        If finalW <> "" Then
            Using con As New SqlClient.SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=""" & PathFinal & "ImaginiDB.mdf"";Integrated Security=True")
                con.Open()
                Using cmd = con.CreateCommand()
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = "INSERT NewIcon (Name) VALUES ('" & finalW.Trim() & "')"
                    cmd.Connection = con
                    cmd.ExecuteNonQuery()
                End Using
                currentcounter = currentcounter + 1
                Dim Id As String = ""
                Using command = con.CreateCommand()
                    command.CommandType = CommandType.Text
                    command.CommandText = "SELECT * FROM NewIcon WHERE Name='" & finalW & "'"
                    Using reader As SqlDataReader = command.ExecuteReader()
                        While reader.Read()
                            Id = reader(0)
                        End While
                    End Using
                End Using
                For Each item As String In finalO
                    Using cmd2 = con.CreateCommand()
                        cmd2.CommandType = CommandType.Text
                        cmd2.CommandText = "INSERT OldIcon (NID,Name) VALUES ('" & Id & "','" & item.ToString.Trim() & "')"
                        cmd2.Connection = con
                        cmd2.ExecuteNonQuery()
                    End Using
                    currentcounter = currentcounter + 1
                Next
                Dim cur As Long = currentcounter * 100 / counter
                SetProgress(cur)
            End Using
        End If
    End If
Next
GC.Collect()
GC.WaitForPendingFinalizers()
SetLabel4Text("FINISHED IMPORT", Color.Red)

正如@jmcilhinney在评论中提到的那样 不同的连接使用不同的池,如MSDN所述:

第一次打开连接时,会根据需要创建连接池 关于一个精确匹配算法,该算法将池与 连接中的连接字符串

因此,我决定实施该方法:

SqlConnection.ClearPool(connection As SqlConnection)
我使用以下方法将其放置在末尾之前:

    Dim cur As Long = currentcounter * 100 / counter
    SetProgress(cur)
    SqlConnection.ClearPool(con)
End Using

有时,con.close()在结束前使用帮助。。。不确定,这对您的情况是否有帮助。@muffi在每次使用结束时都尝试过,但仍然出现错误。您应该阅读ADO.NET中的连接池。
SqlConnection
是一个轻量级对象,实际数据库连接存在于较低级别。连接池意味着多个
SqlConnection
对象将使用相同的基础连接对象,并且在您关闭
SqlConnection
后,系统将保持该对象打开一段时间,以加快后续的使用。顺便说一下,我建议您介绍一下
路径。将
方法和
SqlConnectionStringBuilder
类结合起来。@jmchiliney谢谢,我将查看
路径。将
SqlConnectionStringBuilder
结合起来清理代码。但是,有没有一种方法可以加快关闭底层连接对象的速度,因为即使等待2-3分钟也似乎不起作用。
    Dim cur As Long = currentcounter * 100 / counter
    SetProgress(cur)
    SqlConnection.ClearPool(con)
End Using