TcaplusDB SQL Driver/C++ 是用于连接C++应用程序到TcaplusDB服务器的TcaplusDBConnector。用于以传统方式使用SQL语句的TcaplusDB服务器。
TcaplusDB SQL Driver/C++二进制发行版是以特定于平台的压缩格式提供的。二进制发行版也以更通用的格式以压缩的tar文件或zip压缩包提供。 TcaplusDB SQL Driver/C++二进制发行版可用于几个平台,以压缩的tar文件或zip压缩包形式打包,在这里表示为PACKAGE.tar.gz或PACKAGE.zip. 要解压tar文件,在预期的安装目录中使用此命令: tar zxvf PACKAGE.tar.gz
从Zip压缩包安装(.zip),使用WinZip或者其他可以读取“.zip"文件的工具,将文件解压缩到您选择的位置的文件。
TcaplusDB版本: TcaplusDB SQL Driver/C++基于TcaplusDB 3.53.0开发。
C++标准: TcaplusDB SQL Driver/C++基于C++98标准开发。
通过TcaplusDB SQL Driver/C++连接TcaplusDB,链接格式如下: tcp://<instance_ip>:<instance_port>?app_id=<app_id>&zone_id=<zone_id>
其中<instance_ip>为实例主机ip;<instance_port>为开放端口,默认为9999;<app_id>为业务id,<zone_id>为游戏区id。 连接与读取数据示例:
#include "cppconn/statement.h" #include "cppconn/resultset.h" #include "cppconn/connection.h" #include "cppconn/driver.h" #include "cppconn/metadata.h" #include "cppconn/resultset.h" #include "cppconn/resultset_metadata.h" #include "cppconn/prepared_statement.h" #include "tcapsql_driver.h" #include <iostream> int main() { sql::Driver *driver; sql::Connection *conn; sql::Statement *state; sql::ResultSet *rset; try { driver = sql::tcapsql::get_driver_instance(); conn = driver->connect("tcp://192.168.0.1:9999?app_id=2&zone_id=3", "", "123456"); state = conn->createStatement(); rset = state->executeQuery("SELECT * FROM user WHERE user_id = '10000'"); while (rset->next()) { std::cout << rset->getString(1) << std::endl; } delete rset; delete state; delete conn; } catch (sql::SQLException &e) { std::cout << "catch errCode " << e.getErrorCode() << " errMsg " << e.what() << std::endl; return EXIT_FAILURE; } return 0; }
Makefile
export TCAPSQL_DRIVER=/youpath/TcaplusSQLDriver3.53.1.204605.x86_64_release_20210521/release/x86_64/; CPPFILE=$(wildcard *.cpp) LIBS +=-L$(TCAPSQL_DRIVER)/lib -Wl,-Bstatic -ltcaplus_sqldriver -Wl,-Bdynamic -lpthread -lanl INC = -I$(TCAPSQL_DRIVER)/include/ .PHONY: all clean all: g++ -o mytest $(CPPFILE) $(INC) ${LIBS} clean: rm -f mytest
使用xml定义TcaplusDB表,示例如下:
<?xml version="1.0" encoding="GBK" standalone="yes" ?> <metalib name="demo_table" tagsetversion="1" version="1"> <struct name="user" version="1" primarykey="user_id,server_id" splittablekey="user_id"> <entry name="user_id" type="string" size="450" desc="用户ID"/> <entry name="server_id" type="uint64" desc="服务器ID" /> <entry name="nick_name" type="string" size="50" desc="昵称"/> <entry name="desc" type="string" size="1024" desc="描述信息"/> <entry name="state" type="Tinyuint" defaultvalue="0" desc="用户状态 0 : AVALIABLE, 1 DELETED"/> <index name="index1" column="user_id"/> <index name="index2" column="user_id,server_id"/> </struct> </metalib>
元素 metalib 是 xml 文件的根元素。
包含 primarykey 的 struct 元素是一个表,不包含 primarykey 的 struct 元素为一个普通结构体。
每次修改表结构时,版本属性值需要相应地加1,初始版本始终为1。
primarykey 属性指定主键字段;对于 generic 表,您最多可以指定8个主键字段,对于 list 表,则可以指定7个。
splittablekey 属性等效于分片键(shard key),TcaplusDB 表被拆分存储到多个存储节点。splittablekey 必须是主键字段之一,一个好的 splittablekey 应该具有高度分散性,这意味着值的范围很广,建议选用字符串类型。
desc 属性包含当前元素的描述。
entry 元素定义一个字段,支持的值类型包括 int32,string,char,int64,double,short 等。
index 元素定义一个索引,该索引必须包含 splittablekey。由于可以使用主键查询表,因此索引不应与主键属性相同。
通过调用 get_driver_instance 可以获取到driver实例,每个进程获取一次足矣。
sql::Driver * driver = sql::tcapsql::get_driver_instance();
使用后端TcaplusDB的连接信息生成 URL 并建立连接
// IP #define DIR_HOST "192.168.0.1" // port #define DIR_PORT "9999" // app_id #define APP_ID 2 // zone_id #define ZONE_ID 3 // signature #define SIGNATURE "123456" char url[120] = {0}; snprintf(url, 120, "tcp://%s:%d?app_id=%d&zone_id=%d", DIR_HOST, DIR_PORT , APP_ID, ZONE_ID); // 中间参数为收发线程的线程名,conn的收发线程名相同,说明使用同一个收发线程收发包。 // 1个收发线程可以处理大概200个conn的请求响应。不过conn越多会造成延时变高,按需调整。 sql::Connection * conn = driver->connect(url, "instance1", SIGNATURE);
Statement
对象可以执行基本SQL查询,并通过 ResultSet
类获取结果。 对从 driver.connect()
获取的 Connection
对象调用 createStatement()
方法,则可创建一个 Statement
实例,之后就可以通过调用 executeQuery(String)
方法使用SQL语句执行SELECT查询。 如果要更新数据库中的数据,可以使用 executeUpdate(String SQL)
方法。 当语句是SELECT时,可以通过调用 getResultSet()
方法获取查询结果。当语句是UPDATE,INSERT,DELETE时,可以通过对 Statement
实例调用 getUpdateCount()
获取受影响的行数。 以下是执行SELECT查询的示例:
sql::Statement * state = conn->createStatement(); sql::ResultSet * rset = state->executeQuery("SELECT * FROM user WHERE user_id = '10000'"); while (rset->next()) { std::cout << rset->getString(1) << std::endl; } delete rset; delete state;
**TcaplusDB和sql数据类型对应关系
TcaplusDB数据类型 | sql类型 |
---|---|
int8 |
sql::DataType::TINYINT (TINYINT) |
uint8 |
sql::DataType::TINYINT (TINYINT UNSIGNED) |
int16 |
sql::DataType::SMALLINT (SMALLINT) |
uint16 |
sql::DataType::SMALLINT (SMALLINT UNSIGNED) |
int32 |
sql::DataType::INTEGER (INT) |
uint32 |
sql::DataType::INTEGER (INT UNSIGNED) |
int64 |
sql::DataType::BIGINT (BIGINT) |
uint64 |
sql::DataType::BIGINT (BIGINT UNSIGNED) |
float |
sql::DataType::REAL (FLOAT) |
double |
sql::DataType::DOUBLE (DOUBLE) |
string |
sql::DataType::VARCHAR (VARCHAR) |
binary |
sql::DataType::VARBINARY (BLOB) |
TcaplusDB部分常见错误码及说明如下:
错误码 | 描述 | 说明 |
---|---|---|
2309 | TXHDB_ERR_RECORD_IS_NOT_SET_TTL | 记录未设置过期时间 |
261 | TXHDB_ERR_RECORD_NOT_EXIST | 该记录不存在 |
-261 | TXHDB_ERR_INVALID_ARGUMENTS | 内部参数错误 |
-273 | PROXY_ERR_INVALID_PARAMS | 内部参数错误 |
-275 | API_ERR_OVER_MAX_KEY_FIELD_NUM | 主键字段个数超过限制,Generic表限制数为4, List表限制数为3 |
-517 | TXHDB_ERR_INVALID_MEMBER_VARIABLE_VALUE | 内部参数错误 |
-525 | SVR_ERR_FAIL_TIMEOUT | 存储层请求超时 |
-529 | PROXY_ERR_NO_NEED_ROUTE_BATCHGET_ACTION_MSG_WHEN_NODE_IS_IN_SYNC_STATUS | 有损搬迁中部分命令不支持, 目前大多为无损搬迁,不会有该错误码 |
-531 | API_ERR_OVER_MAX_VALUE_FIELD_NUM | 非主键字段个数超过限制,Generic表限制数为128, List表限制数:127 |
-773 | TXHDB_ERR_ALREADY_OPEN | 引擎文件重复打开 |
-781 | SVR_ERR_FAIL_SHORT_BUFF | buf太短,内部错误 |
-785 | PROXY_ERR_NO_NEED_ROUTE_WHEN_NODE_IS_IN_REJECT_STATUS | 有损搬迁中部分命令不支持, 目前大多为无损搬迁,不会有该错误码 |
-787 | API_ERR_OVER_MAX_FIELD_NAME_LEN | 字段名称大小超过限制(32B) |
-1037 | SVR_ERR_FAIL_SYSTEM_BUSY | 存储层过载, 请联系DBA |
-1043 | API_ERR_OVER_MAX_FIELD_VALUE_LEN | 字段值长度指超过限制 |
-1293 | SVR_ERR_FAIL_RECORD_EXIST | insert的记录已存在 |
-1299 | API_ERR_FIELD_NOT_EXSIST | 访问的字段不存在, 请确定字段名拼写正确 |
-1549 | SVR_ERR_FAIL_INVALID_FIELD_NAME | 访问的字段不存在, 请确定表结构已更新到后端 |
-1555 | API_ERR_FIELD_TYPE_NOT_MATCH | 字段值的数据类型与其定义类型不匹配 |
-1792 | GEN_ERR_TABLE_READONLY | 表处于只读模式,请检查RCU, WCU或容量是否超出用户设定的阈值 |
-1805 | SVR_ERR_FAIL_VALUE_OVER_MAX_LEN | 记录超过最大长度,序列化后不能超过10MB |
-1811 | API_ERR_PARAMETER_INVALID | 参数错误 |
-2048 | GEN_ERR_TABLE_READ_DELETE | 容量超限, 可读可删, 但不能写 |
-2061 | SVR_ERR_FAIL_INVALID_FIELD_TYPE | 表字段类型错误 |
-2067 | API_ERR_OPERATION_TYPE_NOT_MATCH | 表类型和命令字不匹配。比如generic表用了list表的命令字 |
-2304 | GEN_ERR_ACCESS_DENIED | 拒绝访问 |
-2317 | SVR_ERR_FAIL_SYNC_WRITE | tcapsvr_fail_sync_write |
-2323 | API_ERR_PACK_MESSAGE | 打包错误,请联系管理员 |
-2560 | GEN_ERR_INVALID_ARGUMENTS | 参数错误,请联系管理员 |
-2573 | SVR_ERR_FAIL_WRITE_RECORD | 写引擎错误,请联系管理员 |
-2579 | API_ERR_UNPACK_MESSAGE | 解包错误,请联系管理员 |
-2816 | GEN_ERR_UNSUPPORT_OPERATION | 不支持的操作,请联系管理员 |
-2823 | ENG_ERR_ENGINE_ERROR | 引擎错误,请联系管理员 |
-2829 | SVR_ERR_FAIL_DELETE_RECORD | 删除引擎记录失败,请联系管理员 |
-3072 | GEN_ERR_NOT_ENOUGH_MEMORY | 内存不足 |
-3079 | ENG_ERR_DATA_ERROR | 数据错误,请联系管理员 |
-3085 | SVR_ERR_FAIL_DATA_ENGINE | SetFieldName操作指定了错误的字段 |
-3091 | API_ERR_OVER_MAX_RECORD_NUM | 客户端访问的表个数超过限制,通常不会出现,出现说明有bug,请联系管理员 |
-3328 | GEN_ERR_NOT_SATISFY_INSERT_FOR_SORTLIST | sortlist相关错误码。 |
-3341 | SVR_ERR_FAIL_RESULT_OVERFLOW | 字段值大小超过其定义类型的限制 |
-3347 | API_ERR_INVALID_COMMAND | 回包的命令不匹配 |
-3603 | API_ERR_NO_MORE_RECORD | 没有记录了 |
-3859 | API_ERR_OVER_KEY_FIELD_NUM | 超过最大key个数限制,当前最大8个key,list表少一个 |
-4109 | SVR_ERR_FAIL_INVALID_INDEX | list数据类型元素下标超过范围 |
-4115 | API_ERR_OVER_VALUE_FIELD_NUM | 超过最大value个数限制,当前最大256个value,list表少一个 |
-4365 | SVR_ERR_FAIL_OVER_MAXE_FIELD_NUM | 超过最大字段个数 |
-4371 | API_ERR_OBJ_NEED_INIT | API未初始化(或未RegisterTable) |
-4621 | SVR_ERR_FAIL_MISS_KEY_FIELD | 请求缺少主键字段或索引字段 |
-4627 | API_ERR_INVALID_DATA_SIZE | 数据大小不对,通常是用户的本地表定义和服务端不一致。 |
-4883 | API_ERR_INVALID_ARRAY_COUNT | 数组大小无效 |
-5137 | PROXY_ERR_PACK_MSG | 打包失败 |
-5139 | API_ERR_INVALID_UNION_SELECT | 无效的union的select |
-5393 | PROXY_ERR_SEND_MSG | 发送消息失败 |
-5395 | API_ERR_MISS_PRIMARY_KEY | 请求中缺少主键 |
-5649 | PROXY_ERR_ALLOCATE_MEMORY | 内存不足 |
-5651 | API_ERR_UNSUPPORT_FIELD_TYPE | 不支持的字段类型 |
-5905 | PROXY_ERR_PARSE_MSG | 解析消息失败 |
-5907 | API_ERR_ARRAY_BUFFER_IS_SMALL | 内存太小 |
-6157 | SVR_ERR_FAIL_LIST_FULL | list表元素个数超过定义范围,请设置元素淘汰 |
-6161 | PROXY_ERR_INVALID_MSG | 无效的消息 |
-6412 | SVR_ERR_FAIL_LOW_VERSION | 版本太低 |
-6417 | PROXY_ERR_FAILED_PROC_REQUEST_BECAUSE_NODE_IS_IN_SYNC_STASUS | 有损搬迁,部分命令不支持,当前主要是无损搬迁,不会遇到该问题 |
-6669 | SVR_ERR_FAIL_HIGH_VERSION | 版本太高 |
-6673 | PROXY_ERR_KEY_FIELD_NUM_IS_ZERO | 没有key字段 |
-6925 | SVR_ERR_FAIL_INVALID_RESULT_FLAG | result_flag设置错误,请参考SDK中result_flag说明 |
-6929 | PROXY_ERR_LACK_OF_SOME_KEY_FIELDS | 请求中缺少key字段 |
-7181 | SVR_ERR_FAIL_PROXY_STOPPING | 接入层正在停止,业务无需关注,API或自动切换新的接入层 |
-7185 | PROXY_ERR_FAILED_TO_FIND_NODE | 找不到路由节点,请联系管理员 |
-7437 | SVR_ERR_FAIL_SVR_READONLY | 存储层只读,通常磁盘写满或在进行主备切换 |
-7441 | PROXY_ERR_INVALID_COMPRESS_TYPE | 不支持的压缩类型 |
-7443 | API_ERR_INCOMPATIBLE_META | 不兼容的表结构, 请检查本地表结构和服务端表结构是否兼容。 |
-7669 | API_ERR_PACK_ARRAY_DATA | 打包数组字段失败 |
-7693 | SVR_ERR_FAIL_SVR_READONLY_BECAUSE_IN_SLAVE_MODE | 请求发向存储层备节点,可能是正在主备切换。若长时间返回该错误码,请联系管理员 |
-7697 | PROXY_ERR_REQUEST_OVERSPEED | 请求速度超过配额 |
-7949 | SVR_ERR_FAIL_INVALID_VERSION | 请检查乐观锁,请求记录版本号与实际记录版本号不一致 |
-7953 | PROXY_ERR_SWIFT_TIMEOUT | 接入层超时 |
-7955 | API_ERR_PACK_UNION_DATA | 打包union数据失败 |
-8205 | SVR_ERR_FAIL_SYSTEM_ERROR | 存储层内部错误,请联系管理员 |
-8209 | PROXY_ERR_SWIFT_ERROR | 接入层事务非超时类错误,请联系管理员 |
-8211 | API_ERR_PACK_STRUCT_DATA | 打包struct失败 |
-8461 | SVR_ERR_FAIL_OVERLOAD | 存储层过载 |
-8465 | PROXY_ERR_DIRECT_RESPONSE | 接入层直接回包, 相当于不走业务逻辑,通常用于测试API |
-8467 | API_ERR_UNPACK_ARRAY_DATA | 解包数组字段失败 |
-8717 | SVR_ERR_FAIL_NOT_ENOUGH_DADADISK_SPACE | 存储层数据盘磁盘空间不足 |
-8721 | PROXY_ERR_INIT_TLOG | 初始化日志模块失败 |
-8723 | API_ERR_UNPACK_UNION_DATA | 解包union数据失败 |
-8973 | SVR_ERR_FAIL_NOT_ENOUGH_ULOGDISK_SPACE | 存储层binlog流水盘磁盘空间不足 |
-8979 | API_ERR_UNPACK_STRUCT_DATA | 解包struct数据失败 |
-9229 | SVR_ERR_FAIL_UNSUPPORTED_PROTOCOL_MAGIC | 内部错误,不支持的接入层协议magic |
-9233 | PROXY_ERR_REQUEST_ACCESS_CTRL_REJECT | 接入层拒绝访问 |
-9235 | API_ERR_INVALID_INDEX_NAME | index不存在 |
-9485 | SVR_ERR_FAIL_UNSUPPORTED_PROTOCOL_CMD | 不支持的命令字 |
-9489 | PROXY_ERR_NOT_ALL_NODES_ARE_IN_NORMAL_OR_WAIT_STATUS | 遍历请求返回该错误码,因为该表处于搬迁状态 |
-9491 | API_ERR_MISS_PARTKEY_FIELD | 缺少partkey字段 |
-9745 | PROXY_ERR_ALREADY_CACHED_REQUEST_TIMEOUT | 路由变更时,cache的请求已超时 |
-9747 | API_ERR_ALLOCATE_MEMORY | 分配内存失败 |
-9997 | SVR_ERR_FAIL_MERGE_VALUE_FIELD | 合并value字段失败,内部错误,请联系管理员 |
-10001 | PROXY_ERR_FAILED_TO_CACHE_REQUEST | 路由变更时,cache请求失败 |
-10003 | API_ERR_GET_META_SIZE | api_get_meta_size_error |
-10253 | SVR_ERR_FAIL_CUT_VALUE_FIELD | 合并value字段失败,内部错误,请联系管理员 |
-10257 | PROXY_ERR_NOT_EXIST_CACHED_REQUEST | 路由变更时,不存在cache请求 |
-10259 | API_ERR_MISS_BINARY_VERSION | 内部错误,二进制字段缺失版本 |
-10509 | SVR_ERR_FAIL_PACK_FIELD | 内部错误,打包字段失败,请联系管理员 |
-10513 | PROXY_ERR_FAILED_NOT_ENOUGH_CACHE_BUFF | 路由变更时,buff不足 |
-10765 | SVR_ERR_FAIL_UNPACK_FIELD | 存储层解包失败 |
-10769 | PROXY_ERR_FAILED_PROCESS_CACHED_REQUEST | 接入层处理缓存的请求失败 |
-10771 | API_ERR_INVALID_RESULT_FLAG | 无效的result flag |
-11021 | SVR_ERR_FAIL_LOW_API_VERSION | api版本太低,请升级api |
-11027 | API_ERR_OVER_MAX_LIST_INDEX_NUM | list表超过最大元素个数 |
-11277 | SVR_ERR_COMMAND_AND_TABLE_TYPE_IS_MISMATCH | 操作表的方法不存在 |
-11283 | API_ERR_INVALID_OBJ_STATUE | 未初始化, 通常出现在遍历请求中 |
-11533 | SVR_ERR_FAIL_TO_FIND_CACHE | 存储层未找到数据分片,内部错误,请联系管理员 |
-11537 | PROXY_ERR_SWIFT_SEND_BUFFER_FULL | 发送缓冲区已满, API处理响应太慢 |
-11539 | API_ERR_INVALID_REQUEST | 无效的请求 |
-11789 | SVR_ERR_FAIL_TO_FIND_META | 存储层未找到表定义, 内部错误,请联系管理员 |
-11793 | PROXY_ERR_REQUEST_OVERLOAD_CTRL_REJECT | 接入层过载 |
-12045 | SVR_ERR_FAIL_TO_GET_CURSOR | 存储层获取遍历游标失败, 可能是同时进行的遍历请求太多,通常不会遇到 |
-12049 | PROXY_ERR_SQL_QUERY_MGR_IS_NULL | 未创建索引? |
-12051 | API_ERR_TABLE_NAME_MISSING | 未设置表名 |
-12301 | SVR_ERR_FAIL_OUT_OF_USER_DEF_RANGE | 超过用户定义的范围 |
-12305 | PROXY_ERR_SQL_QUERY_INVALID_SQL_TYPE | 无效的sql请求 |
-12307 | API_ERR_SOCKET_SEND_BUFF_IS_FULL | 请求发送失败,网络过载,请联系管理员。 |
-12557 | SVR_ERR_INVALID_ARGUMENTS | 内部参数错误 |
-12561 | PROXY_ERR_GET_TRANSACTION_FAILED | 分配失败失败,请联系管理员增加事务并发的配置 |
-12563 | API_ERR_INVALID_MAGIC | magic不对,通信出现问题,若一直有该问题,请联系管理员 |
-12817 | PROXY_ERR_ADD_TRANSACTION_FAILED | 分配失败失败,请联系管理员增加事务并发的配置 |
-12819 | API_ERR_TABLE_IS_NOT_EXIST | 表不存在 |
-13069 | SVR_ERR_NULL_CACHE | 不存在该数据分片 |
-13073 | PROXY_ERR_QUERY_FROM_INDEX_SERVER_FAILED | 查询全局索引失败 |
-13075 | API_ERR_SHORT_BUFF | buff太短 |
-13329 | PROXY_ERR_QUERY_FROM_INDEX_SERVER_TIMEOUT | 查询全局索引超时 |
-13331 | API_ERR_FLOW_CONTROL | api_flow_control |
-13581 | SVR_ERR_METALIB_VERSION_LESS_THAN_ENTRY_VERSION | the metalib version in request is less than entry version |
-13585 | PROXY_ERR_QUERY_FOR_CONVERT_TCAPLUS_REQ_TO_INDEX_SERVER_REQ_FAILED | 解析全局索引的sql语句失败 |
-13587 | API_ERR_COMPRESS_SWITCH_NOT_SUPPORTED_REGARDING_THIS_CMD | 对不支持协议压缩的命令调用的协议压缩SetCompressSwitch |
-13837 | SVR_ERR_INVALID_SELECT_ID_FOR_UNION | 内部错误,请联系管理员 |
-13841 | PROXY_ERR_QUERY_INDEX_FIELD_NOT_EXIST | 索引字段不存在 |
-13843 | API_ERR_FAILED_TO_FIND_ROUTE | 后台网络异常,请求无法发送成功,如持续存在请联系管理员 |
-14093 | SVR_ERR_CAN_NOT_FIND_SELECT_ENTRY_FOR_UNION | 内部错误,请联系管理员 |
-14097 | PROXY_ERR_THIS_SQL_IS_NOT_SUPPORT | 不支持的SQL |
-14099 | API_ERR_OVER_MAX_PKG_SIZE | 插入的记录超过大小限制(1MB) |
-14353 | PROXY_ERR_NO_SUCH_APPID | 接入层认证失败,未找到该业务认证信息 |
-14605 | SVR_ERR_TCAPSVR_PROCESS_NOT_NORMAL | tcapsvr process in abnormal |
-14609 | PROXY_ERR_NO_APP_USER_PASSWD | 接入层找不到用户认证信息 |
-14865 | PROXY_ERR_NO_APP_USER_PASSWD_RECORD | 接入层找不到用户认证信息 |
-15117 | SVR_ERR_INVALID_ARRAY_COUNT | 无效的数组大小 |
-15121 | PROXY_ERR_NO_APP_USER_OPT | 接入层找不到用户认证信息 |
-15123 | API_ERR_ADD_RECORD | failed to add a new record into request |
-15373 | SVR_ERR_REJECT_REQUEST_BECAUSE_ROUTE_IN_REJECT_STATUS | 拒绝请求,svr处于搬迁状态,路由错误。 |
-15377 | PROXY_ERR_NO_APP_USER_OPT_RECORD | 接入层未找到用户认证信息 |
-15379 | API_ERR_ZONE_IS_NOT_EXIST | 不存在的zone |
-15635 | API_ERR_TRAVERSER_IS_NOT_EXIST | 遍历器不存在 |
-15885 | SVR_ERR_FAIL_INVALID_FIELD_VALUE | 无效的字段值 |
-16141 | SVR_ERR_FAIL_PROTOBUF_FIELD_GET | PB表GetRecord操作失败,请联系管理员 |
-16147 | API_ERR_INSTANCE_INIT_LOG_FAILURE | 初始化日志模块失败 |
-16389 | TXHDB_ERR_INVALID_VALUE_DATABLOCK_NUM | 存储层value块个数异常,请联系管理员 |
-16397 | SVR_ERR_FAIL_PROTOBUF_VALUE_BUFF_EXCEED | PB表非主键字段值超过限定大小(256KB) |
-16403 | API_ERR_CONNECTOR_IS_ABNORMAL | 连接异常 |
-16653 | SVR_ERR_FAIL_PROTOBUF_FIELD_UPDATE | PB表FieldSetRecord操作失败,请联系管理员 |
-16659 | API_ERR_WAIT_RSP_TIMEOUT | 超时 |
-16901 | TXHDB_ERR_COMPRESSION_FAIL | 压缩失败 |
-16909 | SVR_ERR_FAIL_PROTOBUF_FIELD_INCREASE | PB表FieldIncRecord操作失败,请联系管理员 |
-17157 | TXHDB_ERR_DECOMPRESSION_FAIL | 解压失败 |
-17165 | SVR_ERR_FAIL_PROTOBUF_FIELD_TAG_MISMATCH | PB表tag不匹配 |
-18445 | SVR_ERR_FAIL_DOCUMENT_NOT_SUPPORT | 不支持Document类请求 |
-18701 | SVR_ERR_FAIL_PARTKEY_INSERT_NOT_SUPPORT | 不支持InsertByPartkey |
-18957 | SVR_ERR_FAIL_SQL_FILTER_FAILED | 分布式索引中,执行sql过滤失败 |
-33541 | TXHDB_ERR_ADD_LSIZE_EXCEEDS_MAX_TSD_VALUE_BUFF_SIZE | 内部错误,请联系管理员 |
-34053 | TXHDB_ERR_TOO_BIG_KEY_BIZ_SIZE | key超过最大限制1KB |
-34309 | TXHDB_ERR_TOO_BIG_VALUE_BIZ_SIZE | value超过最大限制, 10MB |
-34565 | TXHDB_ERR_INDEX_NO_EXIST | 索引不存在 |
-39685 | TXHDB_ERR_FILE_EXCEEDS_LSIZE_LIMIT | 单数据分片超过256GB的最大限制,写入失败 |
假设数据表demo共有六个字段:key1,key2,key3,value1,value2,其中,key1,key2为partkey,key1,key2,key3组成fullkey。
插入操作必须显示指定所有字段的值,除非在表定义中指定了其默认值。 插入单条记录的SQL语句形式如下: INSERT INTO demo (key1,key2,key3,value1,value2) values (x1,x2,x3,x4,x5);
插入多条记录的SQL语句形式如下: INSERT INTO demo (key1,key2,key3,value1,value2) values (x1,x2,x3,x4,x5); INSERT INTO demo (key1,key2,key3,value1,value2) values (x6,x7,x8,x9,x10);
### where子句语法限制
在未配置全局索引的情况下,where子句中的过滤字段由两部分组成:1、必选部分:partkey或fullkey;2、可选部分:过滤条件。 partkey或fullkey:只能进行等值查询,且组成partkey或fullkey的各个字段之间只能用AND连接; 过滤条件:支持NOT、=、>、<、!=、>=、<=运算符,且多个过滤条件之间可以用AND或OR连接,支持key字段或value字段。 1、使用fullkey进行删改查时的where子句形式如下: WHERE key1=x1 AND key2=x2 AND key3=x3;
2、使用fullkey+过滤条件进行删改查时的where子句形式如下,若过滤条件中包含OR运算符,则必须对过滤条件加括号: WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
3、使用partkey进行删改查时的where子句形式如下: WHERE key1=x1 AND key2=x2;
4、使用partkey+过滤条件进行删改查时的where子句形式如下,若过滤条件中包含OR运算符,则必须对过滤条件加括号: WHERE key1=x1 AND key2=x2 AND (过滤条件);
当where子句中的必选部分为partkey时,where子句的执行结果可能是多条记录。
1、通过fullkey删除单条记录时,SQL语句有以下两种形式:
DELETE FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3; DELETE FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
2、通过fullkey批量删除记录时,SQL语句形式如下: DELETE FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3; DELETE FROM demo WHERE key1=x4 AND key2=x5 AND key3=x6;
删除/批量删除操作不支持partkey,批量删除操作暂不支持过滤条件。
1、通过fullkey更新单条记录时,SQL语句有以下两种形式:
UPDATE demo SET value1=x1, value2=x2 WHERE key1=x1 AND key2=x2 AND key3=x3; UPDATE demo SET value1=x1, value2=x2 WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
2、通过fullkey批量更新记录时,SQL语句形式如下: UPDATE demo SET value1=x1, value2=x2 WHERE key1=x3 AND key2=x4 AND key3=x5; UPDATE demo SET value1=x6, value2=x7 WHERE key1=x8 AND key2=x9 AND key3=x10;
更新/批量更新操作不支持partkey,批量更新操作暂不支持过滤条件。
1、通过fullkey查询单条记录时,SQL语句有以下四种形式:
SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3; SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件); SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3; SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 AND (过滤条件);
2、通过partkey查询多条记录时,SQL语句有以下四种形式:
SELECT * FROM demo WHERE key1=x1 AND key2=x2; SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND (过滤条件); SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2; SELECT key1,value1 FROM demo WHERE key1=x1 AND key2=x2 AND (过滤条件);
3、通过fullkey批量查询记录时,SQL语句的形式如下: SELECT * FROM demo WHERE key1=x1 AND key2=x2 AND key3=x3 OR key1=x4 AND key2=x5 AND key3=x6;
批量查询操作暂不支持过滤条件。 4、通过partkey批量查询记录时,SQL语句的形式如下: SELECT * FROM demo WHERE key1=x1 AND key2=x2 OR key1=x3 AND key2=x4;
批量查询操作暂不支持过滤条件。
TcaplusDB提供sql查询语句进行索引查询,其中,sql查询条件中的字段必须是建立了全局索引的字段,另外,如果是聚合查询,那么聚合查询的字段也必须是建立了全局索引的字段; 一个索引查询请求,当前限制最多返回3000条记录;
支持 =, >, >=, <, <=, !=, between, in, not in, like, not like, and, or , 比如:
SELECT * FROM `mail` WHERE user_id>="10004" AND server_id=100; SELECT * FROM `mail` WHERE user_id BETWEEN 10000 AND 10003 AND server_id=100; SELECT * FROM `mail` WHERE user_id="10000" AND server_id=100 AND mail_id LIKE "210507%"; SELECT * FROM `mail` WHERE user_id>="10004" OR server_id<=200;
注意:between查询时,between a and b,对应的查询范围为[a, b],比如 between 1 and 100, 是会包含1和100这两个值的,即查询范围为[1,100] 注意:like查询是支持模糊匹配,其中"%"通配符,匹配0个或者多个字符; “_”通配符,匹配1个字符;
支持limit offset分页查询,比如: SELECT * FROM mail WHERE user_id>"10000" LIMIT 100 OFFSET 2;
注意:当前limit必须与offset搭配使用,即不支持limit 1 或者 limit 0,1这种;
当前支持的聚合查询包括:sum, count, max, min, avg,比如: SELECT server_id, COUNT(DISTINCT user_id), COUNT(*), SUM(state) FROM \
mail` WHERE user_id>="10000" AND server_id=100;` 注意:聚合查询不支持limit offset,即limit offset 不生效; 注意:目前只有count支持distinct,即 select count(distinct(a)) from table where a > 1000; 其他情况均不支持distinct
支持查询部分字段的值,比如: SELECT user_id, \
subject` FROM mail WHERE user_id>="10000";` ### 不支持的sql查询语句
select , a, b from table where a > 1000; select sum(a), a, b from table where a > 1000; select count(), * from table where a > 1000;
select * from table where a > 1000 order by a;
select * from table where a > 1000 group by a;
select sum(a) from table where a > 1000 group by a having sum(a) > 10000;
select * from table1 where table1.a > 1000 and table1.a = table2.b;
select * from table where a > 1000 and b in (select b from table where b < 5000);
(1)不支持join查询; (2)不支持union查询; (3)不支持类似 select a+b from table where a > 1000 的查询; (4)不支持类似 select from table where a+b > 1000 的查询; (5) 不支持类似 select from table where a >= b 的查询; (6)不支持其他未提到的查询;
TcaplusDB暂不支持跨数据行的事务。 调用TcaplusDB SQL Driver/C++的Connection.commit()方法,实际上是将多条增删改语句(从上次commit到当前时间通过Statement.executeUpdate()方法执行的语句)一并提交给服务端执行。这里需要注意的是,由于多条语句是在同一个请求中发送到服务端,受请求包大小的限制,这里当前限制每次提交的语句上限是100条。 由于暂不支持跨数据行的事务,同一批提交的语句,有可能部分成功,部分失败,此时可以先通过Statement.getUpdateCount()方法,获取实际增删改的数据条,判断是否符合预期,与些同时,也可以通过Statement.getResultSet()获取增删改失败的数据主键信息,后台会通过该接口将失败的数据的主键列的值返回给应用。
在Windows上,可以在不同的构建配置中构建应用程序,这些配置确定最终可执行文件使用的C++运行时库的类型:
应用程序可以在32位或64位模式下构建.
可以在发布或调试模式下构建应用程序。
您可以在动态运行时库( /MD
链接器选项)或静态运行库( /MT
链接器选项)。MSVC编译器的不同版本也使用运行时库的不同版本。
要构建TcaplusDB SQL Driver/C++应用程序,使用Windows的构建人员必须满足以下条件:
需要MicrosoftVisualStudio的可接受版本。
应用程序应该使用与构建TcaplusDB SQL Driver/C++相同的构建配置。生成配置包括构建模式(发布模式或调试模式)和链接器选项(例如, /MD
或 /MDd
).
运行客户端应用程序的目标主机必须具有可接受版本的Visual C++。
以下部分提供了有关构建TcaplusDB SQL Driver/C++应用程序的几个方面的其他详细信息:
使用兼容的编译器版本构建应用程序和TcaplusDB SQL Driver/C++非常重要。使用与构建TcaplusDB SQL Driver/C++相同的构建配置构建应用程序也很重要。也就是说,应用程序应该使用相同的构建模式和链接器选项,以确保TcaplusDB SQL Driver/C++和应用程序使用相同的运行时库。 下表显示了适用于构建模式和运行时库的每个组合的链接器选项。它还显示了每个组合是否可以从TcaplusDB获得TcaplusDB SQL Driver/C++二进制包。(如果不是,您必须自己构建TcaplusDB SQL Driver/C++。) 表5.1每个构建模式和运行时库的TcaplusDB SQL Driver/C++链接器选项
构建模式 | 运行库 | 链接器选项 | 二进制包可用 |
---|---|---|---|
释放 | 动态 | /MD |
是 |
调试 | 动态 | /MDd |
是 |
释放 | 静态 | /MT |
否(从源头构建) |
调试 | 静态 | /MTd |
否(从源头构建) |
表5.2目前支持的版本信息对应关系
TcaplusDB SQL Driver/C++ 版本 | TcaplusDB版本 | VC版本 | tsf4g版本 | 链接器选项 |
---|---|---|---|---|
Tcaplus_SQLDriver_3.53.1.24f9d0e62f_Win64Vc14MT_Release_xxxxxxx | 3.53.1 | VC14 | TSF4G_BASE-2.7.30.191616_Win64Vc14Mt_Release | /MT |
Tcaplus_SQLDriver_3.53.1.24f9d0e62f_Win64Vc14MD_Release_xxxxxxx | 3.53.1 | VC14 | TSF4G_BASE-2.7.30.191616_Win64Vc14Md_Release | /MD |
tsf4gbase库,下载对应版本,请注意VC的版本,采用MD(多线程DLL)或MT(多线程静态),还有Debug或Release版本
添加tsf4gbase库目录:工程---属性---配置属性---VC++目录---库目录:加上lib文件存放目录.
解压TcaplusDB SQL Driver/C++发布包,vs2015(及以上版本)新建工程.
添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录.
添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录.
然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名
/* Creates a Statement object for sending SQL statements to the database. SQL statements without parameters are normally executed using Statement objects. If the same SQL statement is executed many times, it may be more efficient to use a PreparedStatement object. Returns: a new default Statement object Throws: SQLException - if a database access error occurs or this method is called on a closed connection */ sql::Statement * createStatement(); /* Retrieves the driver that produced this connection object. Returns: the driver that produced this connection object Throws: SQLException - if a database access error occurs */ Driver *getDriver(); /* Releases this Connection object's database Specified by: close in interface AutoCloseable Throws: SQLException - SQLException if a database access error occurs */ void close(); /* Retrieves a DatabaseMetaData object that contains metadata about the database to which this Connection object represents a connection. The metadata includes information about the database's tables, its supported SQL grammar, its stored procedures, the capabilities of this connection, and so on. Returns: a DatabaseMetaData object for this Connection object Throws: SQLException - if a database access error occurs or this method is called on a closed connection */ sql::DatabaseMetaData * getMetaData(); /* Retrieves whether this Connection object has been closed. A connection is closed if the method close has been called on it or if certain fatal errors have occurred. This method is guaranteed to return true only when it is called after the method Connection.close has been called. This method generally cannot be called to determine whether a connection to a database is valid or invalid. A typical client can determine that a connection is invalid by catching any exceptions that might be thrown when an operation is attempted. Returns: true if this Connection object is closed; false if it is still open Throws: SQLException - if a database access error occurs */ bool isClosed(); /* Creates a PreparedStatement object for sending parameterized SQL statements to the database. A SQL statement with or without IN parameters can be pre-compiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times. Parameters: sql - an SQL statement that may contain one or more '?' IN parameter placeholders Returns: a new default PreparedStatement object containing the pre-compiled SQL statement Throws: SQLException - if a database access error occurs or this method is called on a closed connection */ sql::PreparedStatement * prepareStatement(const sql::SQLString& sql);
/* Retrieves a description of the tables available in the connection. Each table description has the following columns: TABLE_CAT String => table catalog (may be null) TABLE_SCHEM String => table schema (may be null) TABLE_NAME String => table name TABLE_TYPE String => table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM". REMARKS String => explanatory comment on the table TYPE_CAT String => the types catalog (may be null) TYPE_SCHEM String => the types schema (may be null) TYPE_NAME String => type name (may be null) SELF_REFERENCING_COL_NAME String => name of the designated "identifier" column of a typed table (may be null) REF_GENERATION String => specifies how values in SELF_REFERENCING_COL_NAME are created. Values are "SYSTEM", "USER", "DERIVED". (may be null) Note: Some databases may not return information for all tables. Parameters: catalog - a catalog name; must match the catalog name as it is stored in the database; (not support) schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; (not support) tableNamePattern - a table name pattern; must match the table name as it is stored in the database; (not support) types - a list of table types, which must be from the list of table types returned from getTableTypes(),to include; (not support) Returns: ResultSet - each row is a table description Throws: SQLException - if a database access error occurs */ sql::ResultSet * getTables(const sql::SQLString& catalog, const sql::SQLString& schemaPattern, const sql::SQLString& tableNamePattern, std::list<sql::SQLString> &types); /* Retrieves a description of table columns available in the connection. Each column description has the following columns: TABLE_CAT String => table catalog (may be null) TABLE_SCHEM String => table schema (may be null) TABLE_NAME String => table name COLUMN_NAME String => column name DATA_TYPE int => SQL type from java.sql.Types TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified COLUMN_SIZE int => column size. BUFFER_LENGTH is not used. DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable. NUM_PREC_RADIX int => Radix (typically either 10 or 2) NULLABLE int => is NULL allowed. columnNoNulls - might not allow NULL values columnNullable - definitely allows NULL values columnNullableUnknown - nullability unknown REMARKS String => comment describing column (may be null) COLUMN_DEF String => default value for the column, which should be interpreted as a string when the value is enclosed in single quotes (may be null) SQL_DATA_TYPE int => unused SQL_DATETIME_SUB int => unused CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column ORDINAL_POSITION int => index of column in table (starting at 1) IS_NULLABLE String => ISO rules are used to determine the nullability for a column. YES --- if the column can include NULLs NO --- if the column cannot include NULLs empty string --- if the nullability for the column is unknown SCOPE_CATALOG String => catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF) SCOPE_SCHEMA String => schema of table that is the scope of a reference attribute (null if the DATA_TYPE isn't REF) SCOPE_TABLE String => table name that this the scope of a reference attribute (null if the DATA_TYPE isn't REF) SOURCE_DATA_TYPE short => source type of a distinct type or user-generated Ref type, SQL type from java.sql.Types (null if DATA_TYPE isn't DISTINCT or user-generated REF) IS_AUTOINCREMENT String => Indicates whether this column is auto incremented YES --- if the column is auto incremented NO --- if the column is not auto incremented empty string --- if it cannot be determined whether the column is auto incremented IS_GENERATEDCOLUMN String => Indicates whether this is a generated column YES --- if this a generated column NO --- if this not a generated column empty string --- if it cannot be determined whether this is a generated column The COLUMN_SIZE column specifies the column size for the given column. For numeric data, this is the maximum precision. For character data, this is the length in characters. For datetime datatypes, this is the length in characters of the String representation (assuming the maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype, this is the length in bytes. Null is returned for data types where the column size is not applicable. Parameters: catalog - a catalog name; must match the catalog name as it is stored in the database; (not support) schemaPattern - a schema name pattern; must match the schema name as it is stored in the database; (not support) tableNamePattern - a table name pattern; must match the table name as it is stored in the database columnNamePattern - a column name pattern; must match the column name as it is stored in the database (not support) Returns: ResultSet - each row is a column description Throws: SQLException - if a database access error occurs */ sql::ResultSet * getColumns(const sql::SQLString& catalog, const sql::SQLString& schemaPattern, const sql::SQLString& tableNamePattern, const sql::SQLString& columnNamePattern); /* Retrieves the connection that produced this metadata object. Returns: the connection that produced this metadata object Throws: SQLException - if a database access error occurs */ sql::Connection * getConnection();
/* Retrieves the connection that produced this statement object. Returns: the connection that produced this statement object Throws: SQLException - if a database access error occurs */ sql::Connection * getConnection(); /* Releases this Statement object Specified by: close in interface AutoCloseable Throws: SQLException - if a database access error occurs */ void close(); /* Executes the given SQL statement, which may return multiple results. In some (uncommon) situations, a single SQL statement may return multiple result sets and/or update counts. Normally you can ignore this unless you are (1) executing a stored procedure that you know may return multiple results or (2) you are dynamically executing an unknown SQL string. The execute method executes an SQL statement and indicates the form of the first result. You must then use the methods getResultSet or getUpdateCount to retrieve the result, and getMoreResults to move to any subsequent result(s). Note:This method cannot be called on a PreparedStatement or CallableStatement. Parameters: sql - any SQL statement Returns: true if the first result is a ResultSet object; false if it is an update count or there are no results Throws: SQLException - if a database access error occurs, this method is called on a closed Statement, the method is called on a PreparedStatement or CallableStatement SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ bool execute(const sql::SQLString& sql); /* Executes the given SQL statement, which returns a single ResultSet object. Note:This method cannot be called on a PreparedStatement or CallableStatement. Parameters: sql - an SQL statement to be sent to the database, typically a static SQL SELECT statement Returns: a ResultSet object that contains the data produced by the given query; never null Throws: SQLException - if a database access error occurs, this method is called on a closed Statement, the given SQL statement produces anything other than a single ResultSet object, the method is called on a PreparedStatement or CallableStatement SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ sql::ResultSet * executeQuery(const sql::SQLString& sql); /* Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement. Note:This method cannot be called on a PreparedStatement or CallableStatement. Parameters: sql - an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. Returns: either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing Throws: SQLException - if a database access error occurs, this method is called on a closed Statement, the given SQL statement produces a ResultSet object, the method is called on a PreparedStatement or CallableStatement SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ int executeUpdate(const sql::SQLString& sql); /* Retrieves the current result as a ResultSet object. This method should be called only once per result. Returns: the current result as a ResultSet object or null if the result is an update count or there are no more results Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ sql::ResultSet * getResultSet(); /* Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result. Returns: the current result as an update count; -1 if the current result is a ResultSet object or there are no more results Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ uint64_t getUpdateCount(); /* Retrieves the number of seconds the driver will wait for a Statement object to execute.(default 5 second) If the limit is exceeded, a SQLException is thrown. Returns: the current query timeout limit in seconds; zero means there is no limit Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ unsigned int getQueryTimeout(); /* Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds. By default there is 5 second Parameters: seconds - the new query timeout limit in seconds; zero means there is no limit Throws: SQLException - if a database access error occurs, this method is called on a closed Statement or the condition seconds >= 0 is not satisfied */ void setQueryTimeout(unsigned int seconds);
/* Retrieves the connection that produced this prepared statement object. Returns: the connection that produced this prepared statement object Throws: SQLException - if a database access error occurs */ sql::Connection *getConnection(); /* Clears the current parameter values immediately. In general, parameter values remain in force for repeated use of a statement. Setting a parameter value automatically clears its previous value. However, in some cases it is useful to immediately release the resources used by the current parameter values; this can be done by calling the method clearParameters. Throws: SQLException - if a database access error occurs or this method is called on a closed PreparedStatement */ void clearParameters(); /* Releases this Prepared Statement object Specified by: close in interface AutoCloseable Throws: SQLException - SQLException if a database access error occurs */ void close(); /* Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement. Some prepared statements return multiple results; the execute method handles these complex statements as well as the simpler form of statements handled by the methods executeQuery and executeUpdate. The execute method returns a boolean to indicate the form of the first result. You must call either the method getResultSet or getUpdateCount to retrieve the result; you must call getMoreResults to move to any subsequent result(s). Returns: true if the first result is a ResultSet object; false if the first result is an update count or there is no result Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or an argument is supplied to this method SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ bool execute(); /* Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement. Some prepared statements return multiple results; the execute method handles these complex statements as well as the simpler form of statements handled by the methods executeQuery and executeUpdate. The execute method returns a boolean to indicate the form of the first result. You must call either the method getResultSet or getUpdateCount to retrieve the result; you must call getMoreResults to move to any subsequent result(s). Parameters: sql - an SQL statement that may contain one or more '?' IN parameter placeholders Returns: true if the first result is a ResultSet object; false if the first result is an update count or there is no result Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or an argument is supplied to this method SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ bool execute(const sql::SQLString& sql); /* Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query. Returns: a ResultSet object that contains the data produced by the query; never null Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or the SQL statement does not return a ResultSet object SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ sql::ResultSet *executeQuery(); /* Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query. Parameters: sql - an SQL statement that may contain one or more '?' IN parameter placeholders Returns: a ResultSet object that contains the data produced by the query; never null Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or the SQL statement does not return a ResultSet object SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ sql::ResultSet *executeQuery(const sql::SQLString& sql); /* Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. Returns: either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or the SQL statement returns a ResultSet object SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ int executeUpdate(); /* Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement. Parameters: sql - an SQL statement that may contain one or more '?' IN parameter placeholders Returns: either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing Throws: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or the SQL statement returns a ResultSet object SQLTimeoutException - when the driver has determined that the timeout value that was specified by the setQueryTimeout method has been exceeded and has at least attempted to cancel the currently running Statement */ int executeUpdate(const sql::SQLString& sql); /* Sets the number of seconds the driver will wait for a Statement object to execute to the given number of seconds. By default there is 5 second Parameters: seconds - the new query timeout limit in seconds; zero means there is no limit Throws: SQLException - if a database access error occurs, this method is called on a closed Statement or the condition seconds >= 0 is not satisfied */ void setQueryTimeout(unsigned int seconds); /* Retrieves the number of seconds the driver will wait for a Statement object to execute.(default 5 second) If the limit is exceeded, a SQLException is thrown. Returns: the current query timeout limit in seconds; zero means there is no limit Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ unsigned int getQueryTimeout(); /* Retrieves the current result as a ResultSet object. This method should be called only once per result. Returns: the current result as a ResultSet object or null if the result is an update count or there are no more results Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ sql::ResultSet * getResultSet(); /* Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result. Returns: the current result as an update count; -1 if the current result is a ResultSet object or there are no more results Throws: SQLException - if a database access error occurs or this method is called on a closed Statement */ uint64_t getUpdateCount(); /* Sets the designated parameter to a istream object. The driver converts this to an SQL VARBINARY value when it sends it to the database. Parameters: parameterIndex - index of the first parameter is 1, the second is 2, ... inputStream - An object that contains the data to set the parameter value to. Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setBlob(unsigned int parameterIndex, std::istream * inputStream); /* Sets the designated parameter to the given data time value. e.g '2016:08:02 12:12:30' The driver converts this to an SQL BIGINT value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setDateTime(unsigned int parameterIndex, const sql::SQLString& value); /* Sets the designated parameter to the given double value. The driver converts this to an SQL DOUBLE value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setDouble(unsigned int parameterIndex, double value); /* Sets the designated parameter to the given int32_t value. The driver converts this to an SQL INTEGER value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setInt(unsigned int parameterIndex, int32_t value); /* Sets the designated parameter to the given uint32_t value. The driver converts this to an SQL INTEGER value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setUInt(unsigned int parameterIndex, uint32_t value); /* Sets the designated parameter to the given int64_t value. The driver converts this to an SQL BIGINT value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setInt64(unsigned int parameterIndex, int64_t value); /* Sets the designated parameter to the given uint64_t value. The driver converts this to an SQL BIGINT value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setUInt64(unsigned int parameterIndex, uint64_t value); /* Sets the designated parameter to the given String value. The driver converts this to an SQL VARCHAR when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... x - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setString(unsigned int parameterIndex, const sql::SQLString& value); /* Sets the designated parameter to the given int8_t value. The driver converts this to an SQL TINYINT when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... x - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setInt8(unsigned int parameterIndex, int8_t value); /* Sets the designated parameter to the given uint8_t value. The driver converts this to an SQL TINYINT when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... x - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setUInt8(unsigned int parameterIndex, uint8_t value); /* Sets the designated parameter to the given int16_t value. The driver converts this to an SQL SMALLINT when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... x - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setInt16(unsigned int parameterIndex, int16_t value); /* Sets the designated parameter to the given uint16_t value. The driver converts this to an SQL SMALLINT when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... x - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setUInt16(unsigned int parameterIndex, uint16_t value); /* Sets the designated parameter to the given float value. The driver converts this to an SQL REAL value when it sends it to the database. Parameters: parameterIndex - the first parameter is 1, the second is 2, ... value - the parameter value Throws: SQLException - if parameterIndex does not correspond to a parameter marker in the SQL statement; if a database access error occurs or this method is called on a closed PreparedStatement */ void setFloat(unsigned int parameterIndex, float value);
/* Releases this ResultSet object When a ResultSet is closed, any ResultSetMetaData instances that were created by calling the getMetaData method remain accessible. Calling the method close on a ResultSet object that is already closed is a no-op. Specified by: close in interface AutoCloseable Throws: SQLException - if a database access error occurs */ void close(); /* Maps the given ResultSet column label to its ResultSet column index. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column index of the given column name Throws: SQLException - if the ResultSet object does not contain a column labeled columnLabel, a database access error occurs or this method is called on a closed result set */ uint32_t findColumn(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a Blob istream. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: a Blob object representing the SQL BLOB value in the specified column Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set SQLFeatureNotSupportedException - if the JDBC driver does not support this method */ std::istream * getBlob(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a Blob istream. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: a Blob object representing the SQL BLOB value in the specified column Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set SQLFeatureNotSupportedException - if the JDBC driver does not support this method */ std::istream * getBlob(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a bool type. If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is false Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ bool getBoolean(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a bool type. If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is false Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ bool getBoolean(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a double type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ long double getDouble(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a double type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ long double getDouble(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int32_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ int32_t getInt(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int32_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ int32_t getInt(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint32_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ uint32_t getUInt(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint32_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ uint32_t getUInt(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int64_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ int64_t getInt64(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int64_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ int64_t getInt64(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint64_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ uint64_t getUInt64(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint64_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ uint64_t getUInt64(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int8_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ int8_t getInt8(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int8_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ int8_t getInt8(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint8_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ uint8_t getUInt8(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint8_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ uint8_t getUInt8(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int16_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ int16_t getInt16(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an int16_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ int16_t getInt16(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint16_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ uint16_t getUInt16(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an uint16_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ uint16_t getUInt16(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an float type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ float getFloat(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as an float type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ float getFloat(const sql::SQLString& columnLabel) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a String type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is "" Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ SQLString getString(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a String type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is "" Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ SQLString getString(const sql::SQLString& columnLabel) const; /* Retrieves the number, types and properties of this ResultSet object's columns. Returns: the description of this ResultSet object's columns Throws: SQLException - if a database access error occurs or this method is called on a closed result set */ sql::ResultSetMetaData * getMetaData() const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a time_t type. Parameters: columnIndex - the first column is 1, the second is 2, ... Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set */ time_t getTimestamp(uint32_t columnIndex) const; /* Retrieves the value of the designated column in the current row of this ResultSet object as a time_t type. Parameters: columnLabel - the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column Returns: the column value; if the value is SQL NULL, the value returned is 0 Throws: SQLException - if the columnLabel is not valid; if a database access error occurs or this method is called on a closed result set */ time_t getTimestamp(const sql::SQLString& columnLabel) const; /* Moves the cursor froward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on. When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. If the result set type is TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver implementation will return false or throw an SQLException on a subsequent call to next. Returns: true if the new current row is valid; false if there are no more rows Throws: SQLException - if a database access error occurs or this method is called on a closed result set */ bool next(); /* Retrieves whether this ResultSet object has been closed. A ResultSet is closed if the method close has been called on it, or if it is automatically closed. Returns: true if this ResultSet object is closed; false if it is still open Throws: SQLException - if a database access error occurs */ bool isClosed() const;
/* Returns the number of columns in this ResultSet object. Returns: the number of columns Throws: SQLException - if a database access error occurs */ unsigned int getColumnCount(); /* Gets the designated column's suggested title for use in printouts and displays. The suggested title is usually specified by the SQL AS clause. If a SQL AS is not specified, the value returned from getColumnLabel will be the same as the value returned by the getColumnName method. Parameters: column - the first column is 1, the second is 2, ... Returns: the suggested column title Throws: SQLException - if a database access error occurs */ SQLString getColumnLabel(unsigned int columnIndex); /* Get the designated column's name. Parameters: column - the first column is 1, the second is 2, ... Returns: column name Throws: SQLException - if a database access error occurs */ SQLString getColumnName(unsigned int columnIndex); /* Retrieves the designated column's SQL type. Parameters: column - the first column is 1, the second is 2, ... Returns: SQL type from java.sql.Types Throws: SQLException - if a database access error occurs */ int getColumnType(unsigned int columnIndex); /* Retrieves the designated column's database-specific type name. Parameters: column - the first column is 1, the second is 2, ... Returns: type name used by the database. If the column type is a user-defined type, then a fully-qualified type name is returned. Throws: SQLException - if a database access error occurs */ SQLString getColumnTypeName(unsigned int columnIndex);
TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。