数据库:关于BULK INSERT 学习笔记(1)

书接上回

数据库:Sqlserver 2019 ,ODBC , BULK INSERT C++.10万行数据,写入耗时3S_wenluderen的专栏-CSDN博客

***

子:

#define COUNT (100000) 这个表示合计要插入的行数。

#define ROW_ARRAY_SIZE 1000//每次插入的行数

**

后面代码做了两个嵌套for循环,就为了多次写入。 最终效果是写入100次,每次写入1000行,合计10万行。

**

此处做了第一次剥离, 将最外面的for循环剥离。

丑:

程序里面定义#define ROW_ARRAY_SIZE 1000//每次插入的行数

然后呢

ORDWTH  ordwth_array[ROW_ARRAY_SIZE];

这个ORDWTH   是一个结构体。看结构体里面 内容,应该是一个超市里面的货物。

这个结构体里面包含货物的价格,供应商,库存,数量 等等常规信息。

为了便于理解,我打算把ORDWTH 这个名字改掉,修改为:supermarker_goods

就是超市货物的意思,缩写为:s_m_g.

寅:

然后重点来了, 超市里面的货物种类很多,所以新建了一个数组。原来名字叫

ordwth_array[ROW_ARRAY_SIZE];其中ROW_ARRAY_SIZE=1000

我修改后名字为:s_m_g_array。

我觉得 这个BULK INSERT 的核心思想在于,将要写入的数据打包好,整体写入

卯:

BULK INSERT  是一种空间换时间的技术,会使用很多内存空间,也就是句柄

SQLAllocHandle这个函数就是用申请句柄(内存空间的):

SQL_HANDLE_ENV:用于申请环境句柄

SQL_HANDLE_DBC :用于申请连接句柄

SQL_HANDLE_DESC:用于申请描述符句柄

 SQL_HANDLE_STMT:用于申请语句句柄

ODBC学习笔记—SQLAllocHandle_不上进的程序员-CSDN博客_sqlallochandle

获取到环境句柄后,就可以设定设个环境的很多属性,用的函数是:SQLSetEnvAttr。

(只有在环境中未分配任何连接句柄时,应用程序才能调用 SQLSetEnvAttr。

可以设定的属性包含:

1)SQL_ATTR_ODBC_VERSION (根据取值决定ODBC表现出的版本特性。)

2)SQL_ATTR_OUTPUT_NTS(确定返回字符串的结束符。默认值为 SQL_TRUE返回’/0’结束)

3)SQL_ATTR_CP_MATCH(决定从连接池中选择连接的精度。)

4)SQL_ATTR_CONNECTION_POOLING(连接池)

ODBC学习笔记—SQLSetEnvAttr_不上进的程序员-CSDN博客_sqlsetenvattr

巳:

SQLAllocHandle 分配一个环境、连接、语句或描述符句柄

 //第三步:分配链接句柄
   //SQL_HANDLE_DBC :用于申请连接句柄
    SQLHDBC     G_hDbc = NULL;//设备句柄
    Gsz_ret = SQLAllocHandle(SQL_HANDLE_DBC, Gsz_hEnv, &G_hDbc);

然后使用:SQLSetConnectAttr函数设定链接句柄的属性

 Gsz_ret=SQLSetConnectAttr(G_hDbc_linajie, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

1)SQL_ATTR_ACCESS_MODE(SQL_MODE_READ_ONLY  设置为只读连接,)

2)SQL_ATTR_ASYNC_ENABLE(该连接下属的stmthandle所执行的语句可以异步处理)

3)SQL_ATTR_AUTO_IPD(??)

4)SQL_ATTR_AUTOCOMMIT(设置是否自动提交: )

5)SQL_ATTR_CONNECTION_DEAD(终止连接)

6)SQL_ATTR_CONNECTION_TIMEOUT(除了查询与登录外的操作超时时长,单位为秒,整型。默认为0秒,意思不是执行sql语句立马超时而是不会超时,一直等待语句完成才向后执行)

7)SQL_ATTR_CURRENT_CATALOG(一个包含database名称的字符串指针。)

8)SQL_ATTR_LOGIN_TIMEOUT 设置登录超时时长,同SQL_ATTR_CONNECTION_TIMEOUT

9)SQL_ATTR_METADATA_ID(设定连接CATALOG函数参数)

10)SQL_ATTR_ODBC_CURSORS(设置连接游标参数 )

11)SQL_ATTR_PACKET_SIZE(设置连接包大小,格式为(void*)(整型数字))

12)SQL_ATTR_QUIET_MODE(设置对话框,当窗口句柄为空的时候,设置为不显示对话框)

13)SQL_ATTR_TRACE(设置连接是否启用跟踪)

14)SQL_ATTR_TRACEFILE(设置跟踪文件路径,参数为一个 null-terminated 字符串。)

15)SQL_ATTR_TRANSLATE_LIB(设置连接转化字符集的动态库路径,参数为一个 null-terminated 字符串)

16)SQL_ATTR_TRANSLATE_OPTION(设置连接转化字符集的参数)

17)SQL_ATTR_TXN_ISOLATION(设置连接事务隔离级别)

 (SQLSetConnectAttr_jadeshu的博客-CSDN博客

***

  //第四步:开始链接数据库。
    //根据DSN ,连接数据库
    //SQL_NTS 表示自动计算字符串的长度
    Gsz_ret = SQLConnect(G_hDbc_linajie, (SQLTCHAR*)_T("Data_source_Test"), SQL_NTS, (SQLTCHAR*)_T("sa"), SQL_NTS, (SQLTCHAR*)_T("123456"), SQL_NTS);

(下面进入gsz_insert 函数内部)

未:

 分配语句句柄
    SQLHSTMT  hStmt = NULL;
    //SQLAllocHandle 分配一个环境、连接、语句或描述符句柄。
    //该函数就是用来分配句柄的,句柄类型参考参数详解。
    //参数1 HandleType:是需要分配的句柄的类型(SQL_HANDLE_ENV:用于申请环境句柄  SQL_HANDLE_DBC :用于申请连接句柄  SQL_HANDLE_STMT:用于申请语句句柄  SQL_HANDLE_DESC:用于申请描述符句柄  )
    //参数2InputHandle: 是指分配的句柄在什么句柄之上,例如连接句柄,需要在环境句柄之上。
    ret = SQLAllocHandle(SQL_HANDLE_STMT, L_hDbc, &hStmt);

    //甲:分配语句句柄
    SQLHSTMT  hStmt_yuju = NULL;//下面就是围绕 这个语句展开工作,比如配置各种属性.

打个比方吧,这就好比 要要写入的一堆数据,整理好码放整齐,然后一起写入。

(新开一个帖子,继续深究这个语句)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: eff bulk insert(大规模批量插入)是一种高效的数据插入方法,特别适用于需要批量插入大量数据的场景。它的主要特点是通过一次性插入多条记录,减少了数据库的访问次数和网络传输时间,从而提高了插入数据的效率。 使用eff bulk insert可以显著减少数据插入的时间和资源消耗。与传统的逐条插入方式相比,它可以减少对数据库的频繁访问,从而减少了插入数据的时间。使用eff bulk insert还可以减少网络传输时间,因为一次性插入多条记录可以通过一次网络传输完成。 在使用eff bulk insert时,需要准备一个数据集,该数据集包含要插入的多条记录。可以使用CSV文件、Excel文件或其他数据格式来存储这些记录。然后,通过使用数据库提供的API或工具,将数据集一次性插入到数据库中。 使用eff bulk insert需要考虑一些因素。首先,需要确保数据集的准确性和完整性,因为一次性插入可能会导致无法恢复的数据损失。其次,需要根据数据库的要求和限制来调整数据集的大小,以避免超出数据库的容量或性能限制。最后,需要根据实际情况考虑使用并发处理等优化技术,以进一步提高插入数据的效率。 总之,eff bulk insert是一种高效的数据插入方法,可以显著提高大规模批量插入数据的效率。通过一次性插入多条记录,减少了对数据库的频繁访问和网络传输时间,从而节省了时间和资源消耗。使用eff bulk insert需要注意数据集的准确性和完整性,调整数据集的大小,并根据需要使用优化技术。 ### 回答2: Ef BulkInsert是Entity Framework (EF) 提供的一种用于批量插入数据的方法。在传统的插入操作中,每次向数据库插入一条记录都需要与数据库建立连接、执行插入操作、关闭连接等一系列操作,这样的方式效率较低。 而Ef BulkInsert可以通过一次性提交多条数据到数据库,大大提高了插入数据的效率。它采用批量操作的方式,将多条数据一次性插入到数据库中,减少了连接和关闭连接的次数,提高了数据库操作的性能。 使用Ef BulkInsert的步骤如下: 1. 首先,我们需要安装Entity Framework库并引入相关命名空间。 2. 创建EF的DbContext对象,该对象用于和数据库进行交互。 3. 在DbContext对象中,使用BulkInsert方法,将要插入的数据一次性提交到数据库。 4. 执行BulkInsert操作后,数据将被批量插入到数据库中。 需要注意的是,Ef BulkInsert对于大批量数据插入非常有效,但在小规模的插入任务中,效果可能不如预期。此外,由于批量操作会占用较多的系统资源,因此需要根据具体情况进行合理的调整和使用。 总之,Ef BulkInsert是一种通过批量插入数据的方式来提高插入性能的方法,可以有效减少连接和关闭连接的次数,对于大批量数据插入任务非常实用。 ### 回答3: EF BulkInsert 是 Entity Framework (EF) 中的一个功能,用于批量插入数据到数据库中。传统的方法是通过循环遍历每个实体对象并逐个插入到数据库中,这种方式效率较低,尤其是当需要插入大量数据时。 而 EF BulkInsert 则通过内置的高效批量插入算法,能够在一次操作中将多个实体对象一次性插入到数据库中,从而极大地提高了插入数据的速度和效率。 使用 EF BulkInsert 主要包括以下几个步骤: 1. 首先,需要通过 NuGet 包管理器安装 EF BulkInsert 插件。 2. 创建实体对象的列表,将需要插入的数据存储在这个列表中。 3. 调用 EF BulkInsert 插件提供的 API,将实体对象列表作为参数传入,表示将这些实体对象批量插入到数据库中。 4. 执行插入操作后,EF BulkInsert 会自动处理数据库的连接和事务,确保数据的一致性和完整性。 5. 最后,可以根据返回的结果来判断插入是否成功,并进行相应的处理。 EF BulkInsert 在插入大量数据时能够极大地提升性能,减少了循环插入的时间消耗,同时还避免了频繁的数据库连接和事务开启的开销。 需要注意的是,EF BulkInsert 不适用于所有情况,特别是在需要进行复杂数据处理或者需要触发数据库的相关事件时,仍然需要使用传统的逐个插入方式。 总之,EF BulkInsert 是一个高效的批量插入数据的工具,可以在处理大量数据时显著提升性能,提供了更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值