书接上回
(数据库: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;//下面就是围绕 这个语句展开工作,比如配置各种属性.
打个比方吧,这就好比 要要写入的一堆数据,整理好码放整齐,然后一起写入。
(新开一个帖子,继续深究这个语句)