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检索文件?后者似乎更有可能,因为将文件直接保存到磁盘不会损坏它。
任何帮助或建议,将不胜感激。
我只是遇到了同样的问题,下面是解决方法。
在我的例子,我有一个叫做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)字段转储到文件中而不向此数据块添加任何内容。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |