2017-04-05 19 views
1

ローカルの.mdfファイルを使用していて、データベースへのクエリを実行していて、USINGブロックを使用してSqlConnectionとSqlReaderが正しく破棄されていることを確認しています。vb.net SqlConnectionを使用してもファイルが解放されない

次に、ファイルの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) 

MD5世代は走っ:

Public Function GenMD5(ByVal Filename As String) As String 
    Dim MD5 = System.Security.Cryptography.MD5.Create 
    Dim Hash As Byte() 
    Dim sb As New System.Text.StringBuilder 
    Using st As New IO.FileStream(Filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
     Hash = MD5.ComputeHash(st) 
    End Using 
    For Each b In Hash 
     sb.Append(b.ToString("X2")) 
    Next 
    Return sb.ToString 
End Function 
+0

を時々、終了前にcon.close()を使用するには役立ちます...これがあなたの場合に役立つかどうかはわかりません。 – muffi

+0

@muffiそれぞれの使用の最後に試しましたが、まだエラーが発生します。 – Mederic

+0

ADO.NETで接続プーリングについてお読みください。 'SqlConnection'は、実際のデータベース接続が下位レベルに存在する軽量オブジェクトです。接続プーリングとは、複数の 'SqlConnection'オブジェクトが同じ基本接続オブジェクトを使用することを意味し、' SqlConnection'をクローズして後で使用を高速化すると、しばらくの間そのシステムを開いたままにします。 – jmcilhinney

答えて

1

を@jmcilhinney 異なる接続によってコメントで述べたようにMSDNが言うように別のプールを使用します。

接続を最初に開くと、接続プールはに基づいて作成されますは、接続に接続文字列の とプールを関連付ける完全一致アルゴリズムに基づいています。

は、このように私はこの方法を実施することを決定した:

SqlConnection.ClearPool(connection As SqlConnection) 

私が使用してちょうど私のENDの前にこれを置い:

Dim cur As Long = currentcounter * 100/counter 
    SetProgress(cur) 
    SqlConnection.ClearPool(con) 
End Using 
関連する問題