保存到SQL Server时会在文件前添加其他字节

Car*_*cke 4 c# sql-server wcf bcp stream

我通过WCF服务中的SFTP会话收到文件。该文件被读入MemoryStream对象。我已将此流成功输出到磁盘上的文件,并验证了文件已成功传输(使用FileStream而不是来完成MemoryStream)。

但是,当我将其转换MemoryStream为a byte[]并将其保存到SQL Server表(该列声明为VARBINARY(MAX))时,似乎该文件前面已经有8个字节。

举例来说,我使用WCF SFTP服务上传了一个.txt文件,并将其保存到数据库中。然后,使用BCP,将文件输出到磁盘。打开文件后,第一行之前带有“ U”(“ U”和7个空格)。

Office文档也是如此。我已经对.xls文件执行了与上述相同的过程,该文件一开始的大小为49Kb。但是,使用BCP输出文件时,文件已损坏且大小为50Kb。

奇怪的是,.pdf文件似乎可以正确保存和导出。

我正在使用的一些代码片段:

将流转换为字节数组

var stream = (MemoryStream)data;
stream.Seek(0, SeekOrigin.Begin);
byte[] m_Bytes = stream.ToArray();
Run Code Online (Sandbox Code Playgroud)

将字节数组保存到SQL Server

cmd.Parameters.Add("@File", System.Data.SqlDbType.VarBinary, -1).Value = file;
Run Code Online (Sandbox Code Playgroud)

使用BCP将文件从SQL Server导出到文件

bcp "SELECT [File] FROM SFTPUpload.dbo.Upload" queryout "C:\SFTP\Test.txt" -T -N -S Server_Name\Instance_Name
Run Code Online (Sandbox Code Playgroud)

这可能是我用来将文件保存到数据库的方法出现问题,还是我如何使用BCP检索文件?后者似乎更有可能,因为将文件直接保存到磁盘不会损坏它。

任何帮助或建议,将不胜感激。

Mik*_*ill 5

我只是遇到了同样的问题,下面是解决方法。

在我的例子,我有一个叫做SQL Server表“ External_File”和它的领域之一,ExtFile_Data,是一个varbinary(max)包含原始文件数据,通常是一个完整的Excel文件。

外部文件

我想做的是bcp用来将这些原始数据快速导出到我们数据库服务器上的文件中。

该命令几乎可以完美运行...

--  This does not work - don't use it !!
EXEC master..xp_cmdshell 'BCP "select ef.ExtFile_Data 
   FROM [External_File] ef  WHERE ExtFile_ID = 1005" 
   queryout "G:\ImportData\TestFile.xlsm" -T -N'
Run Code Online (Sandbox Code Playgroud)

...但是它在每个文件的开头增加了8个字节,因此无法打开它们。

解决方案是使bcp使用格式化文件,我将其称为“ BCPformat.fmt”。

EXEC master..xp_cmdshell 'BCP "select ef.ExtFile_Data 
   FROM [External_File] ef  WHERE ExtFile_ID = 1005" 
   queryout "G:\ImportData\TestFile.xlsm" -T 
   -f "G:\ImportData\BCPformat.fmt" '
Run Code Online (Sandbox Code Playgroud)

这是我的BCPformat.fmt文件的样子。

10.0
1
1 SQLBINARY 0 0 "" 1 ExtFile_Data ""
Run Code Online (Sandbox Code Playgroud)

请注意,格式文件必须与您要导出的数据结构匹配

就我而言,我只导出了一个名为的列ExtFile_Data,所以这是我的.fmt文件中的字段名称。您的字段名称有所不同,因此您的.fmt文件将需要反映这一点。

但。有了这个.fmt文件之后,(无论运行该脚本的SQL Server用户是可以访问的),我都可以成功地将原始数据导出到Excel文件中,而无需在开头添加额外的8个字节。

而且,这种方法在将大量原始SQL Server数据转换成真实文件方面比我能找到的任何其他方法都快得多

具有讽刺意味的是,bcp它没有一个简单的标志即可将varbinary(max)字段转储到文件中而不向此数据块添加任何内容。

希望这可以帮助。