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'