2012-06-28 10 views
2

我有一個ado.net代碼:C#應用程序持有的文件,即使我已經完成的工作與它

OleDbConnection oconn = new OleDbConnection(); 
       // oconn.ConnectionString ="Driver={Microsoft Visual FoxPro Driver};Provider=vfpoledb.1;SourceType=DBF;SourceDB=" + pelna_sciezka + ";Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"; 
       oconn.ConnectionString = "Provider=vfpoledb.1;Data Source=" + pelna_sciezka + ";Collating Sequence=machine"; 
       oconn.Open(); 
       OleDbCommand ocmd = oconn.CreateCommand(); 
       string na = TBNazwaKonta.Text.Replace("\n",""); 
       na = na.Replace("\r","") ; 
       string ks2 = ks.Replace("\n",""); 
       ks2 = ks2.Replace("\r", ""); 
       OleDbCommand dbCmdNull = oconn.CreateCommand(); 
       dbCmdNull.CommandText = "SET NULL OFF"; 
       dbCmdNull.ExecuteNonQuery();     
       string zapytanie = @"insert into " + @pelna_sciezka + @" (rk, Na,Ks) values (0,'" + na + "','" + ks2 +"')"; 
       ocmd.CommandText = zapytanie; 
       ocmd.ExecuteNonQuery(); 
       oconn.Close(); 

它的工作很好,沒有任何問題。但是我使用的dbf文件正在被另一個程序使用。爲什麼如果我執行查詢並關閉連接,dbf文件仍然由程序持有?如果有人想打開它,錯誤消息是'文件訪問被拒絕'。只有當我關閉應用程序,另一個可以訪問

+3

如果在某處引發異常,則不會實際關閉連接。利用代碼中的使用語句來清理實現IDisposable的資源。 http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+0

你嘗試過'oconn.Dispose()'(關閉的insead)嗎? – ekholm

+0

使用像Heinzi這樣的'使用'模塊暗示 – Jodrell

回答

5

您不關閉您的OleDbCommands。與SqlCommands相反,事實上這是可選的,這個確實對OleDb有所作爲

我建議使用using關鍵字;這可以確保所有資源在塊的末尾自動釋放。作爲額外的好處,它確保在發生異常時也釋放資源,從而永遠不會達到您的手動命令。

using (OleDbConnection oconn = new OleDbConnection()) { 
    oconn.ConnectionString = "Provider=vfpoledb.1;Data Source=" + pelna_sciezka + ";Collating Sequence=machine"; 
    oconn.Open(); 

    using (OleDbCommand ocmd = oconn.CreateCommand()) { 
     string na = TBNazwaKonta.Text.Replace("\n",""); 
     na = na.Replace("\r","") ; 
     string ks2 = ks.Replace("\n",""); 
     ks2 = ks2.Replace("\r", ""); 

     using (OleDbCommand dbCmdNull = oconn.CreateCommand()) { 
      dbCmdNull.CommandText = "SET NULL OFF"; 
      dbCmdNull.ExecuteNonQuery(); 
     } // closes dbCmdNull 

     string zapytanie = @"insert into " + @pelna_sciezka + @" (rk, Na,Ks) values (0,'" + na + "','" + ks2 +"')"; 
     ocmd.CommandText = zapytanie; 
     ocmd.ExecuteNonQuery(); 
    } // closes ocmd 
} // closes connection 
+0

我使用這個 - 文件訪問被拒絕仍然顯示。也許這是一種打開文件不是獨佔的方式? – BKl

+0

@BKI:你可以縮小它嗎?您是否可以生成一個*最小*示例(例如,只有打開的連接,只執行一個命令等)才能重現問題? – Heinzi

+0

您的代碼運行良好,但是第二個使用此dbf文件的應用程序,在關閉主應用程序之前,無法訪問該文件。也許這是垃圾收集器的問題?我會嘗試使用不是獨家連接 – BKl

1

我已經解決了我的問題,還有我進行兩點:
- 我已經改變了所有ado.net代碼,像Heinzi寫
- 從support.microsoft.com/kb/260856
我用的信息

並跟着他們,問題現在已經消失。謝謝大家的幫助!

相關問題