Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复制数据库脱机模式_C#_Sql Server_Sql Server 2008 - Fatal编程技术网

C# 复制数据库脱机模式

C# 复制数据库脱机模式,c#,sql-server,sql-server-2008,C#,Sql Server,Sql Server 2008,我使用SMO传输数据库已经有一段时间了。通过使用TransferDatabase任务,从c#处理起来相当容易 对于我目前的项目,这会变慢。我必须切换到脱机模式,在这种模式下,数据库被分离和归档 从c#开始这样一个过程最简单的方法是什么?我知道有SSI,但如果可能,我不想使用它。在我的机器上安装SSI有点痛苦。我在我的项目中做这项工作。 您可以在C#中使用SqlBulkCopyclass。此类功能非常强大,您可以以最佳性能复制所有数据。 此类生成bcp命令并在服务器上运行。此命令如下所示: bcp

我使用SMO传输数据库已经有一段时间了。通过使用TransferDatabase任务,从c#处理起来相当容易

对于我目前的项目,这会变慢。我必须切换到脱机模式,在这种模式下,数据库被分离和归档


从c#开始这样一个过程最简单的方法是什么?我知道有SSI,但如果可能,我不想使用它。在我的机器上安装SSI有点痛苦。

我在我的项目中做这项工作。 您可以在C#中使用
SqlBulkCopy
class。此类功能非常强大,您可以以最佳性能复制所有数据。 此类生成bcp命令并在服务器上运行。此命令如下所示:

bcp pubs.dbo.authors out c: emppubauthors.bcp –n –Sstevenw –Usa –P
bcp pubs2.dbo.authors in c: emppubauthors.bcp –n –Sstevenw –Usa –P
此命令有许多开关。请参阅此代码:

// Create source connection
SqlConnection source = new SqlConnection(connectionString);
// Create destination connection
SqlConnection destination = new SqlConnection(connectionString);

// Clean up destination table. Your destination database must have the
// table with schema which you are copying data to.
// Before executing this code, you must create a table BulkDataTable
// in your database where you are trying to copy data to.

SqlCommand cmd = new SqlCommand("DELETE FROM BulkDataTable", destination);
// Open source and destination connections.
source.Open();
destination.Open();
cmd.ExecuteNonQuery();
// Select data from Products table
cmd = new SqlCommand("SELECT * FROM Products", source);
// Execute reader
SqlDataReader reader = cmd.ExecuteReader();
// Create SqlBulkCopy
SqlBulkCopy bulkData = new SqlBulkCopy(destination);
// Set destination table name
bulkData.DestinationTableName = "BulkDataTable";
// Write data
bulkData.WriteToServer(reader);
// Close objects
bulkData.Close();
destination.Close();
source.Close();

只需从c发出SQL Server Detach and Attach命令#

像这样的

var sourceConnectionString = "Data Source=sourceServer;Initial Catalog=MyDB;Integrated Security=True;";
var destinationConnectionString = "Data Source=destinationServer;Initial Catalog=MyDB;Integrated Security=True;";

var sourceLocalPath = @"C:\MSSQL\DATA\MyDB.mdf";
var destinationLocalPath = @"C:\MSSQL\DATA\MyDB.mdf";

var sourceRemotePath = @"\\ServerNameA\ShareName\MyDB.mdf";
var destinationRemotePath = @"\\ServerNameB\ShareName\MyDB.mdf";

// Make connections
var sourceConnection = new SqlConnection(sourceConnectionString);
sourceConnection.Open();
var destinationConnection = new SqlConnection(destinationConnectionString);
destinationConnection.Open();

// Detach source database
var sourceCommand = new SqlCommand("sp_detach_db MyDB", sourceConnection);
sourceCommand.ExecuteNonQuery();

// Detach destination database
var destinationCommand = new SqlCommand("sp_detach_db MyDB", destinationConnection);
destinationCommand.ExecuteNonQuery();

// Copy database file
File.Copy(sourceRemotePath, destinationRemotePath);

// Re-attach source database
sourceCommand = new SqlCommand("CREATE DATABASE MyDbName ON (FILENAME = '" + sourceLocalPath + "') FOR ATTACH", sourceConnection);
sourceCommand.ExecuteNonQuery();

// Re-attach destination database
destinationCommand = new SqlCommand("CREATE DATABASE MyDbName ON (FILENAME = '" + destinationLocalPath + "') FOR ATTACH", destinationConnection);
destinationCommand.ExecuteNonQuery();

这个看起来不错。我只是在运行两次这样的代码时遇到了wierd问题。新连接的数据库不能在同一进程中访问@马尔科姆·弗雷克斯纳:附加是一个相当强大的命令,所以它可能会导致问题。您可以仅为此命令使用单独的连接。据我所知,在SQL Server中执行此操作的唯一方法是使用不同的凭据进行连接。另外,请检查凭据是否没有将默认数据库设置为attached DB,这可能会导致问题。最后,连接池导致了问题。我关闭了连接池,现在它可以工作了。