• 金仓数据库KingbaseES客户端编程接口指南-ado.net(13. 复制)


    13. 复制

    KingbaseES 有一个特性,允许高效地从表中批量导入或到处数据。与使用 INSERT 和SELECT 相比,这通常是一种更快的从表中获取数据的方法。

    Kdbndp 支持三种 COPY 操作模式:二进制、文本、和原始二进制。

    13.1. 二进制复制

    此模式使用高效的 KingbaseES 二进制格式将数据传入和传出数据库。用户使用 API 来读取和写入 Kdbndp 解码和编码的行和字段。完成后,您必须调用 Complete() 以保存数据,否则将导致COPY 操作在编写器中被释放回滚。

    /* 导入两列到表数据 */
    using (var writer = Conn.BeginBinaryImport(
                "COPY data(field_text,field_int2) FROM STDIN(FORMAT BINARY)"))
    {
        writer.StartRow();
        writer.Write("Hello");
        writer.Write(8, KdbndpDbType.Smallint);
    
        writer.StartRow();
        writer.Write("Goodbye");
        writer.WriteNull();
    
        writer.Complete();
    }
    
    /* 从表数据中导出两列 */
    using (var reader = Conn.BeginBinaryExport(
               "COPY data(field_text,field_int2) TO STDOUT (FROMAT BINARY)"))
    {
        reader.StartRow();
        Consle.WriteLine(reader.Read());
        Consle.WriteLine(reader.Read(KdbndpDbType.Smallint));
    
        reader.StartRow();
        reader.Skip();
        Consle.WriteLine(reader.isNull); /* Null检查不消耗列 */
        Consle.WriteLine(reader.Read());
    
        reader.StartRow();  /* 最后 StartRow() 返回-1表示读取结束 */
    }
    

    13.2. 文本复制

    此模式使用 KingbaseES 文本或 CSV 格式将数据导入或导出数据库。用户应适当地格式化文本或CSV, Kdbndp 只是提供了一个 TextReader 或 Writer。此模式比二进制复制效率低,主要适用于已经拥有 CSV 或兼容文本格式的数据,且不关心性能的情况。

    using (var writer = conn.BeginTextImport(
                 "COPY data (field_text, field_int4) FROM STDIN")){
         writer.Write("HELLO\t1\n");
         writer.Write("GOODBYE\t2\n");
    }
    
    using (var reader = conn.BeginTextExport(
                 "COPY data (field_text, field_int4) TO STDOUT")){
         Console.WriteLine(reader.ReadLine());
         Console.WriteLine(reader.ReadLine());
    }
    

    13.3. 原始二进制复制

    在这种模式下,数据传输时二进制的,但 Kdbndp 不进行任何编码或解码,数据作为原始 .NET 流传输。此模式仅对批量数据和恢复表有意义:表保存为 blob,以后可以恢复。如果您需要真正理解数据, 则应该使用常规二进制模式。

    示例:

    int len;
    var data = new byte[10000];
    
    /* 导出表table1到数组 */
    using (var inStream = conn.BeginRawBinaryCopy(
                  "COPY table1 TO STDOUT (FORMAT BINARY)")){
        /* 我们假设数据大小为10000字节,在实际使用中,您会反复读取、写入文件 */
        len = inStream.Read(data, 0, data.lenth);
    }
    
    /* 导入数据到table2 */
    using (var outStream = conn.BeginRawBinaryCopy(
                  "COPY table2 FROM STDIN (FORMAT BINARY)")){
        outStream.Write(data, 0, len);
    }
    

    13.4. 取消

    通过在 importer 对象上调用 Cancel() 方法,可以再任何时候取消导入操作。 在关闭或销毁 importer 之前,不会向数据库提交任何数据。

    导出操作也同样可以。

  • 相关阅读:
    Spring | Spring的“数据库开发“ (Srping JDBC)
    【力扣】2578. 最小和分割
    猿创征文|【C++实战小项目】通讯录(一) 纯数组实现基本通讯录模拟详解
    babel转换class时使用defineProperty导致的装饰器问题
    JS中的数据类型
    40道JAVA经典算法面试题(答案)
    Redis 规范部署手册
    java源码系列:链表是什么?数组和它有何不同?(2022-07-28更新完毕)
    PostgreSQL索引篇 | GIN索引 (倒排索引)
    USB设备的音频类UAC
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126778512