2013-03-06 61 views
1

當我嘗試打開鎖定的文本文件與SQL Server

BULK INSERT table FROM 'c:\file.txt' 

我得到

Msg 4861, Level 16, State 1, Line 1 
Cannot bulk load because the file "c:\file.txt" could not be opened. Operating system error code 32(The process cannot access the file because it is being used by another process.). 

錯誤,因爲該文件是由另一個進程打開日誌文件。

但是與C#我可以打開該文件System.IO.FileShare.ReadWrite爲:

using (System.IO.FileStream fileStream = new System.IO.FileStream("c:\\file.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) 
     { 
      using (System.IO.StreamReader streamReader = new System.IO.StreamReader(fileStream)) 
      { 
       file = streamReader.ReadToEnd(); 
      } 
     } 

有沒有辦法讓SQL服務器(BULK INSERT或任何其他)內的讀寫共享功能?

感謝

回答

2

既然你沒有對SQL Server使用幕後的OpenFile標誌控制,你可能需要將文件複製到一個臨時文件做批量插入之前。

+0

不錯的解決方法 – 2013-03-06 23:32:02

+0

+1。擊敗我! – 2013-03-06 23:32:51

0

(從我上DBA.SE的答案,因爲你刪除的問題轉載。)

BULK INSERT嘗試獲取源文件的寫鎖,以確保沒有其他進程同時修改,而該文件讀取發生。這樣做是爲了穩定文件格式,因爲讀取可能最終會嘗試處理並行寫入器正在寫入的部分行。

由於日誌文件已被其他進程打開以供其他進程使用,因此這是不兼容的訪問,並且會出現該錯誤。

關於代碼:

  • FileAccess決定了會與該文件有關。
  • FileShare決定了什麼其他允許您在打開文件時使用該文件。

的記錄過程將使用FileAccess.WriteFileAccess.ReadWrite,並考慮到你的代碼是否能夠成功,可能FileShare.Read - 這將防止其他人同時寫入文件,但允許他們閱讀的內容。您的代碼只請求讀取權限,因此這是兼容的。如果您重新運行代碼並請求寫訪問(FileAccess.Write),代碼將會失敗。

要使用BULK INSERT導入此文件,您必須複製並導入該文件,那麼不會涉及任何文件鎖定。