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