如何使用 .NET 2.0 以编程方式复制 SQL Server 2000 表?

发布于 2024-07-13 09:41:49 字数 83 浏览 4 评论 0原文

我想备份一个表,以其他名称将副本保存在同一数据库中。 我想使用 .NET 2.0(最好是 C#)以编程方式完成此操作。 有人可以指出我应该做什么吗?

I want to backup a table saving the copy in the same database with another name. I want to do it programatically using .NET 2.0 (preferably C#). Someone can point me what should I do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

原来是傀儡 2024-07-20 09:41:49

只需将此查询发送到服务器:

SELECT * INTO [BackupTable] FROM [OriginalTable]

这将从头开始创建备份表(如果它已经存在,则会抛出错误)。 对于大桌子,请做好等待时间的准备。 这应该模仿数据类型、排序规则和 NULL 性(NULL 或 NOT NULL),但不会复制索引、键或类似约束。

如果您需要帮助将 SQL 查询发送到数据库,那就是另一个问题了。

Just send this query to the server:

SELECT * INTO [BackupTable] FROM [OriginalTable]

This will create the backup table from scratch (an error will be thrown if it already exists). For large tables be prepared for it to take a while. This should mimic datatypes, collation, and NULLness (NULL or NOT NULL), but will not copy indexes, keys, or similar constraints.

If you need help sending sql queries to the database, that's a different issue.

谎言 2024-07-20 09:41:49

实现此目的的一种方法是使用 SQL 中的 INTO 以这种方式简单地执行普通查询:

SELECT * 
INTO NewTableName 
FROM ExistingTableName 

这会自动创建一个新表并插入旧表的行。

另一种方法是使用 System.Data.SqlClient 命名空间中的 SqlBulkCopy。 有一篇不错的 CodeProject 文章解释了如何执行此操作:

SQL Bulk Copy with C#.Net< /a>

程序员通常需要转行
用于测试或的生产数据
分析。 最简单的复制方法
从任何资源到 SQL 的大量数据
服务器正在批量复制。 .NET框架
2.0在ADO.NET“System.Data.SqlClient”命名空间中包含一个类:
SqlBulkCopy。 批量复制操作
通常有两个独立的阶段。

在第一阶段,您将获得源代码
数据。 来源可以是各种数据
Access、Excel、SQL 等平台。
您必须在您的
将其包装在 DataTable 中的代码,或者
任何实现的 DataReader 类
IDataReader。 之后,在第二个
阶段,必须连接目标SQL
数据库并执行批量复制
操作。

.Net 中的批量复制操作是
复制大量的非常快速的方法
数据某处到 SQL Server。 这
原因是 Bulkcopy Sql
服务器机制。 插入所有数据
一排一排,一前一后是
非常时间和系统资源
消耗。 但是批量复制机制
一次处理所有数据。 所以数据
插入变得非常快。

代码非常简单:

// Establishing connection

SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder(); 
cb.DataSource = "SQLProduction"; 
cb.InitialCatalog = "Sales"; 
cb.IntegratedSecurity = true;
SqlConnection cnn = new SqlConnection(cb.ConnectionString);  

// Getting source data

SqlCommand cmd = new SqlCommand("SELECT * FROM PendingOrders",cnn); 
cnn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(); 

// Initializing an SqlBulkCopy object

SqlBulkCopy sbc = new SqlBulkCopy("server=.;database=ProductionTest;" +
                                  "Integrated Security=SSPI"); 

// Copying data to destination
sbc.DestinationTableName = "Temp"; 
sbc.WriteToServer(rdr); 

// Closing connection and the others

sbc.Close(); 
rdr.Close(); 
cnn.Close(); 

One way to do this would be to simply execute a normal query this way using INTO in SQL:

SELECT * 
INTO NewTableName 
FROM ExistingTableName 

This automatically creates a new table and inserts the rows of the old one.

Another way would be to use SqlBulkCopy from the System.Data.SqlClient namespace. There is a nice CodeProject article explaining how to do this:

SQL Bulk Copy with C#.Net

Programmers usually need to transfer
production data for testing or
analyzing. The simplest way to copy
lots of data from any resources to SQL
Server is BulkCopying. .NET Framework
2.0 contains a class in ADO.NET "System.Data.SqlClient" namespace:
SqlBulkCopy. The bulk copy operation
usually has two separated phases.

In the first phase you get the source
data. The source could be various data
platforms such as Access, Excel, SQL..
You must get the source data in your
code wrapping it in a DataTable, or
any DataReader class which implements
IDataReader. After that, in the second
phase, you must connect the target SQL
Database and perform the bulk copy
operation.

The bulk copy operation in .Net is a
very fast way to copy large amount of
data somewhere to SQL Server. The
reason for that is the Bulkcopy Sql
Server mechanism. Inserting all data
row by row, one after the other is a
very time and system resources
consuming. But the bulkcopy mechanism
process all data at once. So the data
inserting becomes very fast.

The code is pretty straightforward:

// Establishing connection

SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder(); 
cb.DataSource = "SQLProduction"; 
cb.InitialCatalog = "Sales"; 
cb.IntegratedSecurity = true;
SqlConnection cnn = new SqlConnection(cb.ConnectionString);  

// Getting source data

SqlCommand cmd = new SqlCommand("SELECT * FROM PendingOrders",cnn); 
cnn.Open(); 
SqlDataReader rdr = cmd.ExecuteReader(); 

// Initializing an SqlBulkCopy object

SqlBulkCopy sbc = new SqlBulkCopy("server=.;database=ProductionTest;" +
                                  "Integrated Security=SSPI"); 

// Copying data to destination
sbc.DestinationTableName = "Temp"; 
sbc.WriteToServer(rdr); 

// Closing connection and the others

sbc.Close(); 
rdr.Close(); 
cnn.Close(); 
再见回来 2024-07-20 09:41:49

您可以使用SQL Server 管理对象 (SMO< /a>)。 您可以制作数据库的副本(数据和模式)。 您可以设置很多选项。 以下示例复制整个数据库:

// Connect to the server
Server server = new Server(".");

// Get the database to copy
Database db = server.Databases["MyDatabase"];

// Set options
Transfer transfer = new Transfer(db);
transfer.CopyAllObjects = true;
transfer.DropDestinationObjectsFirst = true;
transfer.CopySchema = true;
transfer.CopyData = true;
transfer.DestinationServer = ".";
transfer.DestinationDatabase = "MyBackupDatabase";
transfer.Options.IncludeIfNotExists = true;


// Transfer Schema and Data
transfer.TransferData();

您可以在以下位置找到传输类的文档: MSDN

You could use the SQL Server Management Objects (SMO). You could make a copy of a database (data and schema). There are a lot of options you can set. The following example copies the entire database:

// Connect to the server
Server server = new Server(".");

// Get the database to copy
Database db = server.Databases["MyDatabase"];

// Set options
Transfer transfer = new Transfer(db);
transfer.CopyAllObjects = true;
transfer.DropDestinationObjectsFirst = true;
transfer.CopySchema = true;
transfer.CopyData = true;
transfer.DestinationServer = ".";
transfer.DestinationDatabase = "MyBackupDatabase";
transfer.Options.IncludeIfNotExists = true;


// Transfer Schema and Data
transfer.TransferData();

You can find the documentation of the Transfer Class on MSDN.

月野兔 2024-07-20 09:41:49

根据表中记录的数量,从 C# 和用户界面执行此操作可能是一个非常糟糕的主意。

对于小桌子来说
使用以下 SQL
创建表 table2 (field1 int, field2 varchar(10)) --当然使用实际的字段名称和数据类型)

insert into table2 (field1, field2)
select field1, field2 from table1

我建议创建表创建一次然后插入,这样您就可以多次向表中添加记录。 选择进入只会工作一次。

Depending on how many records in the table this could be a very bad idea to do from C# and the user interface.

For a small table
use the following SQL
Create table table2 (field1 int, field2 varchar(10)) --use the actual field names and datatypes of course)

insert into table2 (field1, field2)
select field1, field2 from table1

I suggest the create table to create it once and then the insert so that you can add records to the table multiple times. Select into only will work once.

手心的温暖 2024-07-20 09:41:49

至少,您可以执行“SELECT * INTO NEWTable FROM OldTable”。

您想创建所有索引/约束等吗?

编辑:添加到 splattne 的注释中,您将必须获取要复制的表的表实例的句柄。 使用 Script 方法获取它将生成的脚本。 修改脚本字符串以用新名称替换旧名称& 在数据库上运行它。

编辑2: http://msdn。 microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table.table.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.tableviewtabletypebase.script.aspx

At the very least, you could do "SELECT * INTO NEWTable FROM OldTable".

Do you want to create all the indexes/constraints etc?

EDIT: Adding to splattne's comments, you will have to get the handle to Table instance of the table you wish to copy. Use the Script method to get the script it will generate. Modify the script string to replace old names with new names & run it on the DB.

EDIT2: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table.table.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.tableviewtabletypebase.script.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文