2013-03-06 5 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(); 
      } 
     } 

Есть ли способ, чтобы иметь, что ReadWrite функциональность доля в SQL Server (массовой вставки или любой другой)?

Благодаря

ответ

2

Поскольку вы не имеете контроля над флагами OpenFile, который использует SQL Server за кадром, вы, возможно, придется копировать файл во временный файл перед делать объемную вставку.

+0

Хорошее обходное решение –

+0

+1. Побей меня! –

0

(из моего Повторно ответа на DBA.SE, так как вы удалили вопрос.)

BULK INSERT попытки взять блокировку записи на исходный файл, чтобы гарантировать, что никакой другой процесс не одновременно изменения файла в то время как чтение происходит. Это делается для стабилизации формата файла, поскольку чтение может в конечном итоге попытаться обработать частичную строку, написанную параллельным автором.

Поскольку файл журнала открыт для записи другим процессом, это несовместимый доступ, и вы получаете эту ошибку.

О коде:

  • FileAccess определяет, что вы собираетесь делать с файлом.
  • FileShare определяет, что другие разрешено делать с файлом, пока вы его открываете.

Процесс регистрации будет использовать FileAccess.Write или FileAccess.ReadWrite, и при условии, что ваш код успешно, вероятно, FileShare.Read - это будет мешать другим записи в файл одновременно, но и позволяет им читать содержимое. Ваш код запрашивает доступ только для чтения, и поэтому он совместим. Если вы повторно запустите код и запросите доступ на запись (FileAccess.Write), код не сработает.

Чтобы использовать BULK INSERT, чтобы импортировать этот файл, вам необходимо сделать копию и импортировать его, тогда не будет никаких блокировок файлов.

Смежные вопросы