繁体   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