¶ 连接服务器
参考:https://blog.csdn.net/jadeshu/article/details/79474938
(SQLHDBC ConnectionHandle,
SQLRETURN SQL_API SQLConnect*ServerName, SQLSMALLINT NameLength1,
SQLCHAR *UserName, SQLSMALLINT NameLength2,
SQLCHAR *Authentication, SQLSMALLINT NameLength3); SQLCHAR
其中ServerName一般为数据源名称,NameLength1、2、3一般写SQL_NTS即可(Null Terminated String)。如果数据源配置了用户名和密码则UserName和Authentication直接填NULL,NameLength2和NameLength3直接写0即可(仍然填SQL_NTS也可以)。
¶ 读取数据
¶ SQLBindCol
(SQLHSTMT StatementHandle,
SQLRETURN SQL_API SQLBindCol, SQLSMALLINT TargetType,
SQLUSMALLINT ColumnNumber, SQLLEN BufferLength,
SQLPOINTER TargetValue*StrLen_or_Ind); SQLLEN
¶ ColumnNumber
从1开始。
## TargetType
完整的取值范围可以到<sqlext.h>中找。常用的有
sql类型 | TargetType | odbc typedef | C类型 |
---|---|---|---|
CHAR | SQL_C_CHAR | SQLCHAR | char |
INT | SQL_C_SLONG | SQLINTEGER | int |
BIGINT UNSIGNED | SQL_C_UBIGINT | SQLUBIGINT | uint64_t |
BINARY | SQL_C_BINARY | 无 | 随便 |
BLOB | SQL_C_BINARY | 无 | 随便 |
¶ BufferLength
用来存数据的缓冲区的长度。odbc将只使用缓冲区的前BufferLength个字节的空间。如果要存入的数据达到或超过了BufferLength,则只把BufferLength字节的数据存入缓冲区。
¶ 读取字符串示例
由于C语言中字符串以'\0'
结尾,所以缓冲区的长度要比数据库中的多1。例如某表第6列为
char(10) dno
则读取它的代码如下:
[11];
SQLCHAR dno;
SQLLEN dnoLen(serverhstmt, 6, SQL_C_CHAR, (void*)dno, sizeof(dno) - 1, &dnoLen);
SQLBindColwhile (SQL_NO_DATA != SQLFetch(serverhstmt) {
if (dnoLen != SQL_NULL_DATA) {
[dnoLen] = 0;
dno
do_some_thing_with_dno} else {
handle_null_data}
}
¶ SQLBindParameter
microsoft官方文档:https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlbindparameter-function?view=sql-server-ver15
(
SQLRETURN SQLBindParameter,
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLULEN ColumnSize,
SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr,
SQLLEN BufferLength* StrLen_or_IndPtr); SQLLEN
¶ ParameterNumber
从1开始
## InputOutputType
一般是SQL_PARAM_INPUT
和SQL_PARAM_OUTPUT
## ValueType
同SQLBindCol
## ParameterType
告诉odbc这一列的数据类型。
与ValueType的关系:
图片来源:<https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/converting-data-from-c-to-sql-data-types?view=sql-server-ver15>
¶ StrLen_or_IndPtr
如果为NULL则相当于写入的数据是null-terminated。
¶ 获取错误信息
参考:
https://blog.csdn.net/cztjing/article/details/6631031
https://www.cnblogs.com/liangxiaofeng/p/5866354.html
用SQLGetDiagRec
;
SQLINTEGER errnative
[255];
UCHAR errmsg;
SQLSMALLINT errmsglen
[5];
UCHAR errstate(SQL_HANDLE_STMT, serverhstmt,
SQLGetDiagRec1, errstate,
&errnative, errmsg, sizeof(errmsg), &errmsglen);
;
ostringstream err<< "errstate: " << errstate << "\nerrnative: " << errnative << "\nerrmsg: " << errmsg; err