快速、大量、简单的复制两个数据库之间的数据。

本文介绍了一个使用C#实现的从一个数据库(源数据库)到另一个数据库(目标数据库)批量复制数据的方法。通过SqlBulkCopy组件及SqlConnection进行连接配置,利用SqlCommand执行SQL语句选取源数据库中的数据,并将其写入目标数据库指定的表中。此过程还包含了异常处理及资源释放。

 protected void Button1_Click(object sender, EventArgs e)
    {
        string sString;
        string nString;

        SqlConnection sConn = new SqlConnection();
        SqlConnection nConn = new SqlConnection();

        SqlCommand sCom = new SqlCommand();
        SqlDataReader sRead;

        sString = ConfigurationManager.ConnectionStrings["sDB"].ConnectionString;
        nString = ConfigurationManager.ConnectionStrings["nDB"].ConnectionString;

        sConn.ConnectionString = sString;
        sCom.Connection = sConn;
        sCom.CommandText = "Select top 500 * from " + TextBox1.Text.Trim();
        sCom.CommandType = CommandType.Text;
        sCom.Connection.Open();

        SqlBulkCopy nBulk;

        nBulk = new SqlBulkCopy(nString, SqlBulkCopyOptions.UseInternalTransaction);
        nBulk.DestinationTableName = TextBox1.Text.Trim();


        //nBulk.ColumnMappings.Add("x", "q");
        //nBulk.ColumnMappings.Add("a", "m");
        //nBulk.ColumnMappings.Add("b", "x");
        //nBulk.ColumnMappings.Add("c", "y");
        //nBulk.ColumnMappings.Add("d", "z");

        nBulk.BulkCopyTimeout = 500000000;

        nBulk.SqlRowsCopied +=new SqlRowsCopiedEventHandler(OnRowsCopied);

        nBulk.NotifyAfter = 1000;

        sRead = sCom.ExecuteReader();

        try
        {
            nBulk.WriteToServer(sRead);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
            throw;
        }
        finally
        {
            sRead.Close();
        }

    } 

 

 

 TextBox1.Text.Trim()   用来输入表名。

<think>我们参考用户提供的引用[2]关于DBeaver的操作,以及引用[1]中关于SQL复制表结构和数据的语句,结合用户需求:将某个数据库中的表结构及数据复制到另一个数据库,并使用DBeaver工具完成。 操作步骤: 1. 导出原数据库的表结构(DDL)和数据(INSERT语句)到SQL文件。 2. 在目标数据库中执行这些SQL文件,创建表结构并插入数据。 具体步骤如下: 步骤1:导出表结构(DDL) - 在DBeaver中连接到源数据库。 - 在数据库导航器中,展开数据库,找到需要复制的表。 - 右键点击该表,选择“生成SQL” -> “DDL”(可能在不同版本中略有不同,如“DDL for table”)。 - 在打开的DDL窗口中,可以设置选项(如是否包含注释、使用完全限定名等),然后复制生成的SQL语句或直接保存到文件(有些版本支持导出到文件)。 - 或者,可以选择多个表,然后右键选择“生成SQL” -> “DDL for tables”来批量生成。 步骤2:导出表数据(INSERT语句) - 同样在源数据库连接中,右键点击需要导出数据的表。 - 选择“导出数据”。 - 在导出向导中: - 选择导出格式为“SQL”。 - 在“导出目标”中选择“SQL INSERT语句”。 - 点击下一步,设置输出选项(如文件路径、编码等)。 - 完成导出,会生成一个包含INSERT语句的SQL文件。 步骤3:在目标数据库中执行SQL文件 - 连接到目标数据库。 - 打开SQL编辑器(可以新建一个)。 - 将步骤1中生成的DDL SQL文件内容复制到编辑器中并执行,以创建表结构。 - 然后,将步骤2中生成的数据SQL文件(INSERT语句)内容复制到编辑器中并执行,插入数据。 注意:如果目标数据库中已经存在同名的表,需要先删除或使用CREATE TABLE IF NOT EXISTS(如果DDL支持)或者考虑使用DROP TABLE(谨慎)后再创建。 另外,DBeaver也支持直接执行SQL文件: - 在SQL编辑器中,点击工具栏上的“执行SQL脚本”按钮(通常是一个文件夹图标,或者通过菜单“SQL”->“执行脚本”)。 - 选择之前保存的DDL文件和数据文件,依次执行。 但是,如果数据量很大,生成INSERT语句的方式可能会产生非常大的SQL文件,执行效率低。此时可以考虑使用数据库的导出导入工具(如MySQL的mysqldump和mysql命令,PostgreSQL的pg_dump和psql)或者DBeaver的另一种导出方式(如导出为CSV,然后在目标数据库导入CSV)。但用户要求使用DBeaver,所以这里主要介绍SQL文件方式。 如果用户希望一步到位,也可以考虑使用DBeaver的数据库传输功能(如果支持): - 在DBeaver中,菜单“工具”->“数据传输”。 - 选择源数据库和目标数据库,然后选择要传输的表。 - 配置传输选项(包括是否传输结构、数据等),然后执行传输。 具体操作(以DBeaver 21.0.0为例): 1. 打开菜单“工具”->“数据传输”。 2. 在“源容器”中选择源数据库,然后选择要传输的表(可以多选)。 3. 在“目标容器”中选择目标数据库(注意:目标数据库必须已经存在,传输不会自动创建数据库)。 4. 在“映射”选项卡中,可以调整目标表的名称和结构(如果需要)。 5. 在“设置”选项卡中,可以选择传输的对象(表结构、数据、索引等)以及数据写入模式(插入、更新、替换等)。 6. 点击“开始”按钮执行传输。 使用“数据传输”工具可以更高效地完成表结构和数据复制,特别是对于大数据量,因为它可能使用批量插入而不是生成INSERT语句。 因此,推荐使用“数据传输”功能,因为它更简单且高效。 总结两种方法: 方法一:导出SQL脚本再执行(适合小数据量,操作直观) 方法二:使用数据传输工具(适合大数据量,操作更高效) 用户可以根据实际情况选择。 注意:在操作前,请确保目标数据库连接正确,避免误操作。 相关问题: 1. 使用DBeaver传输数据时出现错误如何解决? 2. 如何提高DBeaver导出导入大量数据的性能? 3. DBeaver支持哪些数据库之间数据传输?</think>### DBeaver 跨数据库复制表结构及数据操作指南 #### 方法一:分步导出导入(推荐小数据量) 1. **导出表结构(DDL)** - 连接源数据库 → 右键目标表 → 选择 `生成 SQL` → `DDL` - 复制生成的 **CREATE TABLE** 语句(勾选 `Show comments` 保留注释)[^2] 2. **导出表数据(INSERT)** - 右键目标表 → `导出数据` → 格式选 `SQL` - 设置: ```plaintext 导出目标:SQL INSERT 语句 编码:UTF-8 二进制数据:行内(避免乱码) ``` - 保存为 `.sql` 文件[^2] 3. **导入到目标数据库** - 连接目标数据库 → 新建SQL编辑器 - 执行步骤1的DDL语句创建表结构 - 执行步骤2的SQL文件插入数据: ```sql -- 示例:执行外部SQL文件 \i 'C:\path\to\your_data.sql'; -- PostgreSQL语法 SOURCE C:/path/to/your_data.sql; -- MySQL语法 ``` #### 方法二:数据传输工具(大数据量高效方案) 1. 打开 **数据传输向导** `工具` → `数据传输`(或按 `Ctrl+Shift+T`) 2. **配置传输参数** | 步骤 | 操作说明 | |------------|----------| | 源数据库 | 选择源连接和表 | | 目标数据库 | 选择目标连接 | | 映射选项 | 自动匹配字段(可手动调整) | | 设置 | 勾选 `创建表` 和 `插入数据` | 3. **执行传输** - 点击 `开始` → 自动完成结构创建+数据插入 - 进度条显示实时状态(支持断点续传) --- ### 关键注意事项 1. **数据类型兼容性** - 不同数据库类型(如MySQL→PostgreSQL)需检查: - 自增字段(`AUTO_INCREMENT` vs `SERIAL`) - 日期格式(`DATETIME` vs `TIMESTAMP`) - 建议在目标执行DDL后验证表结构 2. **大数据量优化** - 传输工具中启用 `批量插入`(默认500行/批) - 关闭事务日志(传输前执行 `SET autocommit=0;`) 3. **权限要求** - 目标数据库账号需有 `CREATE TABLE` 和 `INSERT` 权限 - 跨数据库需开放防火墙端口(如3306/5432) > **故障排查**:若传输中断,检查 `View Log` 中的错误日志,常见问题为字段长度溢出或约束冲突。 --- ### 替代方案:SQL 命令直连(需同类型数据库) ```sql -- 示例:MySQL 跨复制 CREATE TABLE target_db.new_table AS SELECT * FROM source_db.original_table; ``` > 适用场景:相同数据库引擎且网络互通
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值