1

当我尝试

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 Server 中的读写共享功能(批量插入或任何其他)?

谢谢

4

2 回答 2

2

由于您无法控制 SQL Server 在后台使用的 OpenFile 标志,因此您可能必须在执行批量插入之前将文件复制到临时文件中。

于 2013-03-06T23:31:44.687 回答
1

(由于您删除了问题,因此从我对 DBA.SE 的回答中重新发布。)

BULK INSERT尝试对源文件进行写锁定,以确保在读取发生时没有其他进程同时修改文件。这样做是为了稳定文件格式,因为读取可能最终会尝试处理由并发写入器写入的部分行。

因为已经打开了日志文件以供另一个进程写入,所以这是不兼容的访问,并且您会收到该错误。

关于代码:

  • FileAccess确定要对文件执行的操作。
  • FileShare确定在您打开文件时允许其他人对文件执行的操作。

记录过程将使用FileAccess.Writeor FileAccess.ReadWrite,并且假设您的代码成功,可能FileShare.Read- 这将阻止其他人同时写入文件,但允许他们读取内容。您的代码仅请求读取访问权限,因此这是兼容的。如果您重新运行代码并请求写入权限 ( FileAccess.Write),则代码将失败。

要用于BULK INSERT导入此文件,您必须复制并导入该文件,这样就不会涉及任何文件锁定。

于 2013-03-07T17:39:45.467 回答