C# bcp导出后文件大小已更改| |还原数据库不起作用[SQL,C|]

C# bcp导出后文件大小已更改| |还原数据库不起作用[SQL,C|],c#,sql,sql-server,export,bcp,C#,Sql,Sql Server,Export,Bcp,我目前正在创建一个表,并用二进制文件和名称填充它: System.Data.SqlClient.SqlCommand commandAdd = new SqlCommand("CREATE TABLE dbo.tempTable (filename VARCHAR(100), blob VARBINARY(max));", conn); conn.Open(); if (commandAdd.ExecuteNonQuery() != 0) { byte[] fileBytes = Sy

我目前正在创建一个表,并用二进制文件和名称填充它:

System.Data.SqlClient.SqlCommand commandAdd = new SqlCommand("CREATE TABLE dbo.tempTable (filename VARCHAR(100), blob VARBINARY(max));", conn);
conn.Open();

if (commandAdd.ExecuteNonQuery() != 0)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(fileSource);
    System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("INSERT INTO dbo.tempTable (blob,filename) values (@blob,@name)", conn);
    command.Parameters.AddWithValue("blob", fileBytes);
    command.Parameters.AddWithValue("name", dbName);
}
然后我尝试将其导出到本地硬盘上的某个位置:

Server server = new Server(new ServerConnection(conn));
server.ConnectionContext.ExecuteNonQuery("xp_cmdshell 'bcp \"SELECT blob FROM " + dbName + ".dbo.tempTable\" queryout " + destinationPath + " -T -c'");
我的问题是导出的文件大小错误

原始大小:2069Kb 新大小:4138Kb

它始终是原始尺寸*2

另一个问题是将数据库还原为SQL不起作用。。。 我认为这是第一个问题造成的问题

sqlConnectionString = "User ID=\"" + username + "\";pwd=\"" + pw + "\";Initial Catalog=master;Data Source=" + dataSource + ";";
using (SqlConnection masterConn = new SqlConnection(sqlConnectionString))
{
    masterConn.Open();
    SqlCommand masterCmd = masterConn.CreateCommand();
    masterCmd.CommandText = "RESTORE DATABASE " + dbName + " FROM DISK = '" + destinationPath + "'";
    masterCmd.ExecuteNonQuery();
}
提前感谢,,
放松

请在下面找到此类SP的示例:

CREATE PROCEDURE [ExportBlobDataFromTable]

@columns varchar(500) = 'ID, BlobColumn, TextColumn', -- the columns used for the export, comma separated
@table varchar(500) = 'BlobTable', -- the table name used for the export
@outputFileName varchar(200) = 'C:\temp\extract.csv', -- fully_qualified_path_to_file
@bcpCommand varchar(1000)
AS
BEGIN

SET @bcpCommand = 'bcp "SELECT ' + @columns + ' FROM ' + @table + '" queryout "' ++@outputFileName + '" -T -n'
EXEC master..xp_cmdshell @bcpCommand
END;
这将创建SP,您可以从其他窗口调用它,如下所示:

USE [test]
GO

DECLARE @columns varchar(500)
DECLARE @table varchar(500)
DECLARE @outputFileName varchar(200)
DECLARE @bcpCommand varchar(1000)

SET @columns = 'ID, BlobColumn, TextColumn';
SET @table  = 'BlobTable'; 
SET @outputFileName = 'C:\temp\extract.csv';

EXECUTE [dbo].[ExportBlobDataFromTable] 
  @columns
 ,@table
 ,@outputFileName
 ,@bcpCommand
GO
或者从你的C#方法:


我希望这有帮助:)

问题是缺少一个格式文件。BCP始终在文件开头添加前缀。这就是文件总是损坏的原因

在cmd中运行此命令:

bcp [insertYourTableNameHereWithoutBrackets] format nul -S [insertYourServerNameHereWithoutBrackets] -T -n -f C:\Format.fmt
然后在SQL Server中运行查询:

xp_cmdshell 'BCP "[YourQueryHereWithoutBrackets]" queryout [YourDestinationPathWithoutBrackets] -T -f C:\Format.fmt'

关于

这可能不是您想要的,但您是否想过使用FILESTREAM而不是BCP来导出数据?这里有一个关于另一个线程的SO示例:这也是我的线程。。我已经试过了,但这不是我们公司需要的方式。用BCP代码和适当的参数创建一个存储过程,然后用c#调用存储过程如何?通过这种方式,您可以验证BCP的导出和导入,而无需考虑c#代码。您可以按我需要的方式向我展示存储的过程吗?太好了。不,这不起作用。同样,原始大小*2作为outputsize。无论如何,谢谢:)如果您尝试使用BCP将数据导入回数据库,会发生什么情况?如果数据没有问题,那么只要导入成功,我就看不出大小有问题。你能只用SQL测试一下吗?我们已经测试过了。导入失败,因为文件无效。很抱歉回到这里,但是您是否使用-n标志使用本机格式导出?我使用-T-c作为标志。
xp_cmdshell 'BCP "[YourQueryHereWithoutBrackets]" queryout [YourDestinationPathWithoutBrackets] -T -f C:\Format.fmt'