返回首页

gbase数据、南大通用产品文档:GBase8s获取有关不透明类型和 UDR 的信息

更新日期:2024年09月11日

UDTMetaData 和 UDRMetaData 类中的许多 setXXX() 方法具有相应的 getXXX() 方法,用
于获取现有不透明类型和 UDR 的特性。
UDTMetaData 类中的 getXXX() 方法
下表总结了 UDTMetaData 类中可用的 getXXX() 方法。对于 field 参数,1 表示内部数据结
构中第一个字段,
2 是第二个字段,
依次类推。
有关 SQL 名称的详细信息,
请参阅 SQL 名
称。
获取的信息
方法签名
其它信息
内部数据结构中的字段
计数
public int
getFieldCount()
如果没有字段,则返回 0
内部数据结构中的字段
名称
public String
getFieldName
int field) throws
SQLException
如果名称不存在,则返回 NULL
内部数据结构中的字段
数据类型代码
public int getFieldType
(int field) throws
SQLException
数据类型代码来自
类 com.gbasedbt.lang.IfxTypes.
。如果数据类型不存在,则返回 -1
内部数据结构中字段的
数据类型名称
public String
getFieldTypeName
(int field) throws
SQLException
如果名称不存在,则返回 NULL
对于字符类型:
字段中的public int
如果未设置长度,则返回 -1

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 188
-
获取的信息
方法签名
其它信息
最大字符数;对于
date-time 或 interval
类型: 编码限定符
getFieldLength
(int field) throws
SQLException
不透明类型的 SQL 名称 public String
getSQLName()
如果未设置名称,则返回 NULL
JAR 文件的 SQL 名称
public String
getJarFileSQLName()
如果未设置名称,则返回 NULL
不透明类型的 Java™ 类
的名称
public String
getClassName()
如果未通过 setClassName() 设
置类名,则返回sqlname(缺省值)。
如果未通过 setSQLName() 设置
SQL 名称,则返回 NULL
固定长度的不透明类型
的长度
public int getLength() 如果未设置长度,则返回 -1
不透明类型的对齐方式
public int
getAlignment()
如果未设置对齐方式,则返回 -1
有关对齐方式代码,请参阅对齐值。

已通
过 setSupportUDR()
指定为支持 UDR 的方法
对象组
public Method[]
getSupportUDRs()
有关支持的 UDR 的详细信息,请参
阅从现有代码创建不透明类型中
setSupportUDR() 的描述。
如果未指
定支持 UDR,则返回 NULL

过 setSupportUDR()
指定为支持 UDR 的
Java 方法的 SQL 名称
public String
getSupportUDRSQLName
(Methodmethod) throws
SQLException
如果未设置名称,则返回 NULL
UDRMetaData 类中的 getXXX() 方法
要获取有关 UDR 的信息,请使用下表中的方法。
获取的信息
方法签名
其它信息
指定为不透明类型的 UDR public Method[] getUDRs()


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 189
-
获取的信息
方法签名
其它信息

java.lang.Method.Refle
ct 方法组
用 UDTMetaData.setUDR()
为不透明类型指定 UDR。
如果没有指定 UDR 则返回
NULL。
Java™ 方法的 SQL 名称
public String
getUDRSQLName(Method method
) throws SQLException
如果没有为 UDR 方法对象
指定 SQL 名称,则返回
NULL



sword GCIParamGet(
CONST dvoid *hndlp,
ub4 htype,
GCIError *errhp,
dvoid **parmdpp,
ub4 pos
);

返回描述句柄或语句句柄中的根据位置指定的参数描述符。

GBase 8s GCI 接口使用指南

南大通用数据技术股份有限公司 44

参数
输入
/输出


hndlp
输入
一个存放描述信息的句柄
htype
输入
hndlp参数句柄的类型,支持以下两种类型:
GCI_HTYPE_STMT – 语句句柄
GCI_DTYPE_PARAM – 参数句柄
errhp
输入
错误信息句柄, 该接口调用失败时, 错误信息会存在该句柄上
parmdpp
输出
输出的描述符句柄, 通过该句柄调用GCIAttrGet函数就可以得到指
定位置上的描述信息
pos
输入
要获取描述符上指定位置的描述信息

如果执行成功, 返回GCI_SUCCESS,否则返回GCI_ERROR。

典型应用场景配置
日志诊断场景
ODBC 日志分为unixODBC 驱动管理器日志和psqlODBC 驱动端日志。
前者可以用于追
溯应用程序API 的执行是否成功,后者是底层实现过程中的一些DFX 日志,用来帮助定位
问题。
unixODBC 日志需要在odbcinst.ini 文件中配置:
[ODBC]
Trace=Yes TraceFile=/path/to/odbctrace.log
[GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
108
psqlODBC 日志只需要在odbc.ini 加上:
[gaussdb] Driver=GaussMPP
Servername=10.10.0.13(数据库Server IP)
...
Debug=1(打开驱动端debug 日志)
unixODBC 日志将会生成在TraceFile 配置的路径下,psqlODBC 会在系统/tmp/下生成
mylog_xxx.log。
高性能场景
进行大量数据插入时,建议如下:

需要设置批量绑定:odbc.ini 配置文件中设置UseBatchProtocol=1、数据库设置

support_batch_bind=on。

ODBC 程序绑定类型要和数据库中类型一致。

客户端字符集和数据库字符集一致。

事务改成手动提交。
odbc.ini 配置文件:
[gaussdb] Driver=GaussMPP
Servername=10.10.0.13(数据库Server IP)
...
UseBatchProtocol=1 (默认打开)
ConnSettings=set client_encoding=UTF8 (设置客户端字符编码,保证和server 端一致)
绑定类型用例:
#include #include #include #include #include
#include
#define MESSAGE_BUFFER_LEN 128 SQLHANDLE h_env = NULL; SQLHANDLE
h_conn = NULL; SQLHANDLE h_stmt = NULL;
void print_error()
{
SQLCHAR
Sqlstate[SQL_SQLSTATE_SIZE+1];
SQLINTEGER NativeError;
SQLCHAR
MessageText[MESSAGE_BUFFER_LEN];
SQLSMALLINT TextLength; SQLRETURN ret = SQL_ERROR;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
109
ret = SQLGetDiagRec(SQL_HANDLE_STMT, h_stmt, 1, Sqlstate, &NativeError, MessageText,
MESSAGE_BUFFER_LEN, &TextLength);
if ( SQL_SUCCESS == ret)
{
printf("\n STMT ERROR-%05d %s", NativeError, MessageText); return;
}
ret = SQLGetDiagRec(SQL_HANDLE_DBC, h_conn, 1, Sqlstate, &NativeError, MessageText,
MESSAGE_BUFFER_LEN, &TextLength);
if ( SQL_SUCCESS == ret)
{
printf("\n CONN ERROR-%05d %s", NativeError, MessageText); return;
}
ret = SQLGetDiagRec(SQL_HANDLE_ENV, h_env, 1, Sqlstate, &NativeError, MessageText,
MESSAGE_BUFFER_LEN, &TextLength);
if ( SQL_SUCCESS == ret)
{
printf("\n ENV ERROR-%05d %s", NativeError, MessageText); return;
}
return;
}
/* 期盼函数返回SQL_SUCCESS */
#define RETURN_IF_NOT_SUCCESS(func) \
{\
SQLRETURN ret_value = (func);\ if (SQL_SUCCESS != ret_value)\
{\
print_error();\
printf("\n failed line = %u: expect SQL_SUCCESS, but ret = %d", LINE , ret_value);\ return
SQL_ERROR; \
}\
}
/* 期盼函数返回SQL_SUCCESS */
#define RETURN_IF_NOT_SUCCESS_I(i, func) \
{\
SQLRETURN ret_value = (func);\ if (SQL_SUCCESS != ret_value)\
{\
print_error();\
printf("\n failed line = %u (i=%d): : expect SQL_SUCCESS, but ret = %d", LINE , (i),
ret_value);\ return SQL_ERROR; \
}\
}

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
110
/* 期盼函数返回SQL_SUCCESS_WITH_INFO */ #define
RETURN_IF_NOT_SUCCESS_INFO(func) \
{\
SQLRETURN ret_value = (func);\
if (SQL_SUCCESS_WITH_INFO != ret_value)\
{\
print_error();\
printf("\n failed line = %u: expect SQL_SUCCESS_WITH_INFO, but ret = %d", LINE ,
ret_value);\ return SQL_ERROR; \
}\
}
/* 期盼数值相等*/
#define RETURN_IF_NOT(expect, value) \ if ((expect) != (value))\
{\
printf("\n failed line = %u: expect = %u, but value = %u", LINE , (expect), (value)); \ return
SQL_ERROR;\
}
/* 期盼字符串相同*/
#define RETURN_IF_NOT_STRCMP_I(i, expect, value) \ if (( NULL == (expect) ) || (NULL
== (value)))\
{\
printf("\n failed line = %u (i=%u): input NULL pointer !", LINE , (i)); \ return SQL_ERROR; \
}\
else if (0 != strcmp((expect), (value)))\
{\
printf("\n failed line = %u (i=%u): expect = %s, but value = %s", LINE , (i), (expect), (value)); \
return SQL_ERROR;\
}
// prepare + execute SQL 语句int execute_cmd(SQLCHAR *sql)
{
if ( NULL == sql )
{
return SQL_ERROR;
}
if ( SQL_SUCCESS != SQLPrepare(h_stmt, sql, SQL_NTS))
{
return SQL_ERROR;
}
if ( SQL_SUCCESS != SQLExecute(h_stmt))
{
return SQL_ERROR;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
111
}
return SQL_SUCCESS;
}
// execute + commit 句柄
int commit_exec()
{
if ( SQL_SUCCESS != SQLExecute(h_stmt))
{
return SQL_ERROR;
}
// 手动提交
if ( SQL_SUCCESS != SQLEndTran(SQL_HANDLE_DBC, h_conn, SQL_COMMIT))
{
return SQL_ERROR;
}
return SQL_SUCCESS;
}
int begin_unit_test()
{
SQLINTEGER ret;
/* 申请环境句柄*/
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &h_env); if
((SQL_SUCCESS != ret) && (SQL_SUCCESS_WITH_INFO != ret))
{
printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_ENV failed ! ret = %d", ret);
return SQL_ERROR;
}
/* 进行连接前必须要先设置版本号*/
if (SQL_SUCCESS != SQLSetEnvAttr(h_env, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3, 0))
{
print_error();
printf("\n begin_unit_test::SQLSetEnvAttr SQL_ATTR_ODBC_VERSION failed ! ret = %d",
ret); SQLFreeHandle(SQL_HANDLE_ENV, h_env);
return SQL_ERROR;
}
/* 申请连接句柄*/
ret = SQLAllocHandle(SQL_HANDLE_DBC, h_env, &h_conn); if (SQL_SUCCESS != ret)
{
print_error();

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
112
printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_DBC failed ! ret = %d", ret);
SQLFreeHandle(SQL_HANDLE_ENV, h_env);
return SQL_ERROR;
}
/* 建立连接*/
ret = SQLConnect(h_conn, (SQLCHAR*) "gaussdb", SQL_NTS,
(SQLCHAR*) NULL, 0, NULL, 0); if (SQL_SUCCESS != ret)
{
print_error();
printf("\n begin_unit_test::SQLConnect failed ! ret = %d", ret);
SQLFreeHandle(SQL_HANDLE_DBC, h_conn); SQLFreeHandle(SQL_HANDLE_ENV,
h_env);
return SQL_ERROR;
}
/* 申请语句句柄*/
ret = SQLAllocHandle(SQL_HANDLE_STMT, h_conn, &h_stmt); if (SQL_SUCCESS != ret)
{
print_error();
printf("\n begin_unit_test::SQLAllocHandle SQL_HANDLE_STMT failed ! ret = %d", ret);
SQLFreeHandle(SQL_HANDLE_DBC, h_conn);
SQLFreeHandle(SQL_HANDLE_ENV, h_env); return SQL_ERROR;
}
return SQL_SUCCESS;
}
void end_unit_test()
{
/* 释放语句句柄*/ if (NULL != h_stmt)
{
SQLFreeHandle(SQL_HANDLE_STMT, h_stmt);
}
/* 释放连接句柄*/ if (NULL != h_conn)
{
SQLDisconnect(h_conn); SQLFreeHandle(SQL_HANDLE_DBC, h_conn);
}
/* 释放环境句柄*/ if (NULL != h_env)
{
SQLFreeHandle(SQL_HANDLE_ENV, h_env);
}
return;
}
int main()

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
113
{
// begin test
if (begin_unit_test() != SQL_SUCCESS)
{
printf("\n begin_test_unit failed."); return SQL_ERROR;
}
// 句柄配置同前面用例
int i = 0;
SQLCHAR* sql_drop = "drop table if exists test_bindnumber_001"; SQLCHAR* sql_create =
"create table test_bindnumber_001("
"f4 number, f5 number(10, 2)" ")";
SQLCHAR* sql_insert = "insert into test_bindnumber_001 values(?, ?)"; SQLCHAR*
sql_select = "select * from test_bindnumber_001";
SQLLEN
RowCount; SQL_NUMERIC_STRUCT st_number;
SQLCHAR
getValue[2][MESSAGE_BUFFER_LEN];
/* step 1. 建表*/ RETURN_IF_NOT_SUCCESS(execute_cmd(sql_drop));
RETURN_IF_NOT_SUCCESS(execute_cmd(sql_create));
/* step 2.1 通过SQL_NUMERIC_STRUCT 结构绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
//第一行: 1234.5678
memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN);
st_number.precision = 8;
st_number.scale = 4;
st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] =
0xBC;
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0,
NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0,
NULL));
// 关闭自动提交
SQLSetConnectAttr(h_conn, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0);
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
//第二行: 12345678
memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN);
st_number.precision = 8;
st_number.scale = 0;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
114
st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] =
0xBC;
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 0, &st_number, 0,
NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 0, &st_number, 0,
NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
//第三行: 12345678
memset(st_number.val, 0, SQL_MAX_NUMERIC_LEN);
st_number.precision = 0;
st_number.scale = 4;
st_number.sign = 1; st_number.val[0] = 0x4E; st_number.val[1] = 0x61; st_number.val[2] =
0xBC;
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0,
NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_NUMERIC, SQL_NUMERIC, sizeof(SQL_NUMERIC_STRUCT), 4, &st_number, 0,
NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.2 第四行通过SQL_C_CHAR 字符串绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLCHAR*
szNumber = "1234.5678";
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_CHAR, SQL_NUMERIC, strlen(szNumber), 0, szNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_CHAR, SQL_NUMERIC, strlen(szNumber), 0, szNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.3 第五行通过SQL_C_FLOAT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLREAL
fNumber = 1234.5678;
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_FLOAT, SQL_NUMERIC, sizeof(fNumber), 4, &fNumber, 0, NULL));

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
115
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_FLOAT, SQL_NUMERIC, sizeof(fNumber), 4, &fNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.4 第六行通过SQL_C_DOUBLE 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS)); SQLDOUBLE
dNumber = 1234.5678;
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_DOUBLE, SQL_NUMERIC, sizeof(dNumber), 4, &dNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_DOUBLE, SQL_NUMERIC, sizeof(dNumber), 4, &dNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
SQLBIGINT bNumber1 = 0xFFFFFFFFFFFFFFFF; SQLBIGINT bNumber2 = 12345;
/* step 2.5 第七行通过SQL_C_SBIGINT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_SBIGINT, SQL_NUMERIC, sizeof(bNumber1), 4, &bNumber1, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_SBIGINT, SQL_NUMERIC, sizeof(bNumber2), 4, &bNumber2, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.6 第八行通过SQL_C_UBIGINT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_UBIGINT,
SQL_NUMERIC, sizeof(bNumber1), 4, &bNumber1, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_UBIGINT,
SQL_NUMERIC, sizeof(bNumber2), 4, &bNumber2, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NO_UCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
SQLLEN lNumber1 = 0xFFFFFFFFFFFFFFFF; SQLLEN lNumber2 = 12345;
/* step 2.7 第九行通过SQL_C_LONG 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_LONG,

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
116
SQL_NUMERIC, sizeof(lNumber1), 0, &lNumber1, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_LONG,
SQL_NUMERIC, sizeof(lNumber2), 0, &lNumber2, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.8 第十行通过SQL_C_ULONG 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_ULONG,
SQL_NUMERIC, sizeof(lNumber1), 0, &lNumber1, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_ULONG,
SQL_NUMERIC, sizeof(lNumber2), 0, &lNumber2, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
SQLSMALLINT sNumber = 0xFFFF;
/* step 2.9 第十一行通过SQL_C_SHORT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_SHORT,
SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_SHORT,
SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.10 第十二行通过SQL_C_USHORT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_USHORT,
SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_USHORT,
SQL_NUMERIC, sizeof(sNumber), 0, &sNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
117
SQLCHAR cNumber = 0xFF;
/* step 2.11 第十三行通过SQL_C_TINYINT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 1, SQL_PARAM_INPUT,
SQL_C_TINYINT,
SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt, 2, SQL_PARAM_INPUT,
SQL_C_TINYINT, SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* step 2.12 第十四行通过SQL_C_UTINYINT 绑定参数*/
RETURN_IF_NOT_SUCCESS(SQLPrepare(h_stmt, sql_insert, SQL_NTS));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
1,
SQL_PARAM_INPUT,
SQL_C_UTINYINT,
SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(SQLBindParameter(h_stmt,
2,
SQL_PARAM_INPUT,
SQL_C_UTINYINT,
SQL_NUMERIC, sizeof(cNumber), 0, &cNumber, 0, NULL));
RETURN_IF_NOT_SUCCESS(commit_exec());
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(1,
RowCount);
/* 用字符串类型统一进行期盼*/
SQLCHAR*
expectValue[14][2] = {{"1234.5678",
"1234.57"},
{"12345678","12345678"},
{"0", "0"},
{"1234.5678","1234.57"},
{"1234.5677","1234.57"},
{"1234.5678","1234.57"},
{"-1","12345"},
{"-1","12345"},
{"4294967295","12345"},
{"18446744073709551615", "12345"},
RETURN_IF_NOT_SUCCESS(execute_cmd(sql_select)); while ( SQL_NO_DATA !=
SQLFetch(h_stmt))
{
RETURN_IF_NOT_SUCCESS_I(i, SQLGetData(h_stmt, 1, SQL_C_CHAR, &getValue[0],
MESSAGE_BUFFER_LEN, NULL));
RETURN_IF_NOT_SUCCESS_I(i, SQLGetData(h_stmt, 2, SQL_C_CHAR, &getValue[1],
MESSAGE_BUFFER_LEN, NULL));
//RETURN_IF_NOT_STRCMP_I(i, expectValue[i][0], getValue[0]);

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
118
//RETURN_IF_NOT_STRCMP_I(i, expectValue[i][1], getValue[1]); i++;
}
RETURN_IF_NOT_SUCCESS(SQLRowCount(h_stmt, &RowCount)); RETURN_IF_NOT(i,
RowCount);
SQLCloseCursor(h_stmt);
/* step final. 删除表还原环境*/
RETURN_IF_NOT_SUCCESS(execute_cmd(sql_drop));
end_unit_test();
}
上述用例中定义了number 列,调用SQLBindParameter 接口时,绑定SQL_NUMERIC
会比SQL_LONG 性能高一些。因为如果是char,在数据库服务端插入数据时需要进行数据
类型转换,从而引发性能瓶颈。