ODBC 连接器

DolphinDB 提供 ODBC 接口的连接器,可以让支持 ODBC 接口的客户端程序直接接入 DolphinDB。

ODBC 支持列表

DolphinDB ODBC 连接器支持以下接口:

功能

接口

连接数据库 SQLAllocHandle, SQLFreeStmt, SQLGetEnvAttr, SQLDriverConnect, SQLDisconnect, SQLFreeConnect, SQLFreeEnv, SQLFreeHandle, SQLConnect
获取配置属性 SQLGetTypeInfo, SQLGetFunctions, SQLGetConnectAttr, SQLSetEnvAttr, SQLGetStmtAttr, SQLGetInfo, SQLSetConnectAttr, SQLSetStmtAttr
获取错误信息 SQLGetDiagRec, SQLGetDiagField
SQL 增删改查 SQLFetch, SQLGetData, SQLPrepare, SQLBindParameter, SQLExecDirect, SQLExecute
获取库表元信息 SQLNumResultCols, SQLRowCount, SQLColAttribute, SQLTables, SQLBindCol, SQLColumns, SQLDescribeCol

ODBC 连接字符串如下例所示:

// 连接字符串
std::string connectionStr = "driver={DolphinDB ODBC Driver};server=ddbHost;port=35998;uid=admin;pwd=123456;"
// 使用 ODBC 的 SQLDriverConnect 函数进行连接。
SQLDriverConnect(hDbc, NULL, (SQLCHAR*)(connectionStr.c_str()), SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);

连接字符串支持以下参数:

server 数据库 IP 地址,用于连接数据库。

port 数据库端口,用于连接数据库。

uid 数据库用户名,用于登录数据库。

pwd 用户密码,用于登录数据库。

enableHighAvailability 布尔值,指示是否高可用模式,默认为 false,表示不开启。

highAvailabilitySites 字符串,用于在开启高可用情况下指定主机名和端口号数组。

enableSSL 布尔值,指示是否启动 SSL 连接。默认为 false,表示不启动。

enableEncryption 布尔值,指示是否加密用户名和密码。默认为 false,表示不加密。

Linux ODBC 驱动环境配置

配置

编辑 /etc/odbcinst.ini 添加 ODBC 驱动位置。

[DolphinDB ODBC Driver]
Description=DolphinDB ODBC Driver
Driver=/path/to/libddbodbc.so

编辑 /etc/odbc.ini 添加数据源。

[dolphindb]
Driver=DolphinDB ODBC Driver
Server=127.0.0.1
Port=8848
Uid=admin
Pwd=123456

验证

通过以下命令连接 DolphinDB。

isql -v -k "dsn=dolphindb"
# 进入isql后,可以使用select * from table(1..10 as id)来查询表数据。

使用示例

示例 ODBC 应用程序提供了一个交互式命令行界面,使用户能够借助 DolphinDB 的 SQL 语法,方便地对数据库执行各类操作。若需深入了解和实践,您可以下载示例代码,体验完整的操作流程。

编译命令

g++ -o command command.cpp -I ./ -lodbc -std=c++11

连接数据源

定义一个 ODBC 错误获取函数,用于后续发生错误时,获取环境句柄、数据库连接句柄和语句句柄的报错信息。

void sqlerr(SQLSMALLINT HandleType, SQLHANDLE handle)
{
    SQLCHAR state[32];
    SQLINTEGER native;
    SQLCHAR message[255];
    SQLGetDiagRec(HandleType, handle, 1, state, &native, message, 255, NULL);
    printf("state = %s, message = %s\n", state, message);
}

申请环境句柄和连接句柄,并建立数据库连接。

SQLHANDLE hEnv;
SQLHANDLE hDbc;
SQLHANDLE hStmt;
int ret;

// 1.分配 ODBC 环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
if (!SQL_SUCCEEDED(ret))
{
	printf("allocate env handle error\n");
	return -1;
}

// 2.设置环境
ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (!SQL_SUCCEEDED(ret))
{
	printf("set env error\n");
	sqlerr(SQL_HANDLE_ENV, hEnv);
	return -1;
}

// 3.分配 ODBC 连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
if (!SQL_SUCCEEDED(ret))
{
	printf("allocate connection handle error\n");
	sqlerr(SQL_HANDLE_ENV, hEnv);
	return -1;
}
bool flag = true;
while(flag) {
	cout << "Your DSN str: \n  For example: dsn=dolphindb \n";
	string dsn;
	getline(cin, dsn);
	if(dsn == "exit" || dsn == "quit") {
		flag = false;
		break;
	}
	// 4.连接数据库
	ret = SQLDriverConnect(hDbc,
			NULL,
			(SQLCHAR*)(dsn.c_str()),
			SQL_NTS,
			NULL,
			0,
			NULL,
			SQL_DRIVER_COMPLETE);
	if (!SQL_SUCCEEDED(ret))
	{
		printf("connect error\n");
		sqlerr(SQL_HANDLE_DBC,hDbc);
		continue;
	}
	break;
}

执行 SQL 语句

申请语句句柄,然后执行 SQL 语句。

// 5.分配语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if (!SQL_SUCCEEDED(ret))
{
  printf("allocate statement handle error\r\n");
	sqlerr(SQL_HANDLE_DBC,hDbc);
	return -1;
}
// 6.执行指定的语句
string stat;
getline(cin, stat);
if(stat == "exit" || stat == "quit") {
	break;
}
ret = SQLExecDirect(hStmt,(SQLCHAR*)(stat.c_str()), SQL_NTS);

if (!SQL_SUCCEEDED(ret))
{
	printf("execute error\n");
	sqlerr(SQL_HANDLE_STMT, hStmt);
	continue;
}

显示查询结果

获取查询结果集的列数,行数及列名。

// 7.取得结果集的列数
SQLSMALLINT sNumResults;
ret = SQLNumResultCols(hStmt, &sNumResults);
if (!SQL_SUCCEEDED(ret))
{
	printf("get result error\n");
	sqlerr(SQL_HANDLE_STMT, hStmt);
	continue;
}

// 8.取得结果集的行数
SQLLEN cRowCount;
ret = SQLRowCount(hStmt, &cRowCount);
if (!SQL_SUCCEEDED(ret))
{
	printf("allocate connection handle error\n");
	sqlerr(SQL_HANDLE_STMT, hStmt);
	continue;
}
// 9.获取列名

for(int i = 0; i < sNumResults; i++)
{
	SQLCHAR colName[64];
	ret = SQLDescribeCol(hStmt, i + 1, colName, 64, NULL, NULL, NULL, NULL, NULL);
	if(!SQL_SUCCEEDED(ret))
	{
		printf("get column name error\n");
		sqlerr(SQL_HANDLE_STMT, hStmt);
		continue;
	}
	printf("%s\t", colName);
}

绑定数据缓冲区。

// 10.将缓冲区提交驱动程序进行绑定。
vector<DataBinding> columnData;
columnData.resize(sNumResults);
int bufferSize = 1024;
vector<vector<char>> buffer;
buffer.resize(sNumResults);
for (int i = 0 ; i < sNumResults ; i++ ) {
	columnData[i].TargetType = SQL_C_CHAR;
	columnData[i].BufferLength = (bufferSize);
	buffer[i].resize(bufferSize);
	columnData[i].TargetValuePtr = buffer[i].data();
}
for (int i = 0 ; i < sNumResults ; i++ ) {
	ret = SQLBindCol(hStmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,
		columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));
		if(!SQL_SUCCEEDED(ret))
		{
			printf("bind col error\n");
			sqlerr(SQL_HANDLE_STMT, hStmt);
			continue;
		}
}

逐行读取数据到缓冲区后打印结果。

// 11.调用 SQLFetch 提取数据,直至返回 SQL_NO_DATA_FOUND。驱动程序将提取的数据写入上一步绑定的缓冲区中,供应用程序访问
for ( ret = SQLFetch(hStmt) ; ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ; ret = SQLFetch(hStmt) ) {
	for (int j = 0 ; j < sNumResults ; j++ ){
		printf( "%s\t",(char*)columnData[j].TargetValuePtr);
	}
	printf("\n");
}

退出 ODBC

退出前需依次释放语句句柄、数据库连接句柄和环境句柄,以确保资源正确释放。

SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

类型转换

ODBC 类型到 DolphinDB 类型

写入数据时默认的类型转换对应关系如下:

ODBC 类型

DolphinDB 类型

SQL_C_CHAR, SQL_C_BINARY, STRING
SQL_C_SHORT, SQL_C_SSHORT SHORT
SQL_C_USHORT INT
SQL_C_LONG, SQL_C_SLONG, SQL_C_ULONG, SQL_C_SBIGINT, SQL_C_UBIGINT LONG
SQL_C_FLOAT, SQL_C_DOUBLE DOUBLE
SQL_C_BIT, SQL_C_TINYINT, SQL_C_STINYINT, SQL_C_UTINYINT CHAR
SQL_C_DATE, SQL_C_TYPE_DATE, DATE
SQL_C_TIME, SQL_C_TYPE_TIME SECOND
SQL_C_TIMESTAMP, SQL_C_TYPE_TIMESTAMP DATE,MONTH,TIME,MINUTE,SECOND,DATETIME,TIMESTAMP,NANOTIME,NANOTIMESTAMP,DATEHOUR

DolphinDB 类型到 ODBC 类型

支持查询的 DolphinDB 类型:

BOOL, CHAR, SHORT, INT, LONG, DATE, MONTH, TIME, MINUTE, SECOND, DATETIME, TIMESTAMP, NANOTIME, NANOTIMESTAMP, DATEHOUR, FLOAT, DOUBLE, SYMBOL, STRING, BLOB, INT128, UUID, IPADDR。

DolphinDB 的数值类型可以转为 ODBC 的任意数值类型,DolphinDB 的时间类型可以转换为 ODBC 的任意时间类型。

获取数据时默认的类型转换对应关系:

DolphinDB 类型

ODBC 类型

BOOL SQL_BIT
CHAR SQL_TINYINT
SHORT SQL_SMALLINT
INT SQL_INTEGER
LONG SQL_BIGINT
MONTH, DATE SQL_DATE
TIME, MINUTE, SECOND, NANOTIME SQL_TIME
DATEHOUR, DATETIME, TIMESTAMP, NANOTIMESTAMP SQL_TIMESTAMP
FLOAT SQL_FLOAT
DOUBLE SQL_DOUBLE
BLOB, SYMBOL, STRING, UUID, INT128, IP SQL_VARCHAR