簡體   English   中英

使用SQL Server打開鎖定的文本文件

[英]Open a Locked Text File with 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();
            }
        }

有沒有辦法讓ReadWrite在SQL Server中共享功能(批量插入或任何其他方式)?

謝謝

由於您無法控制SQL Server在后台使用的OpenFile標志,因此您可能必須在批量插入之前將文件復制到臨時文件。

(因為您刪除了問題,所以從我對DBA.SE的回答中轉貼了。)

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

由於已打開日志文件以供另一個進程進行寫入,因此這是不兼容的訪問,並且會出現該錯誤。

關於代碼:

  • FileAccess確定將要處理的文件。
  • FileShare確定在打開文件時允許其他人處理文件。

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

要使用BULK INSERT導入此文件,您必須制作一個副本並將其導入,這樣就不會涉及任何文件鎖定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM