# 第三方交互 / TinyODBC TinyODBC 是遵循 ODBC 3.5 的外部驱动,用于让支持 ODBC 的客户端执行 TSL 并读取结果集 TinyODBC 本身不是可由 TSL 直接调用的顶级 function、class 或 unit。本页记录驱动级能力,不新增 TSL API 条目 ## 驱动接口范围 驱动支持以下 ODBC 接口: - 句柄与连接:`SQLAllocHandle`、`SQLConnect`、`SQLFreeHandle`、`SQLFreeStmt`、`SQLSetConnectAttr`、`SQLGetConnectAttr` - 语句执行:`SQLExecDirect`、`SQLPrepare`、`SQLExecute`、`SQLBindParameter`、`SQLNumParams`、`SQLEndTran` - 结果读取:`SQLBindCol`、`SQLFetch`、`SQLFetchScroll`、`SQLGetData`、`SQLMoreResults`、`SQLNumResultCols`、`SQLRowCount`、`SQLSetPos` - 元数据与诊断:`SQLColAttribute`、`SQLColumns`、`SQLDescribeCol`、`SQLGetDescField`、`SQLGetDiagField`、`SQLGetDiagRec`、`SQLGetFunctions`、`SQLGetInfo`、`SQLGetStmtAttr`、`SQLGetTypeInfo`、`SQLStatistics`、`SQLTables` 这些名称属于标准 ODBC C API;此处仅列出支持范围,不补写未公开的完整 C 原型、参数或返回类型 ## TSL 类型映射 | ODBC 类型 | TSL 类型 | 说明 | | --------------- | --------------- | ---------------------------------- | | `SQL_BIGINT` | `TSL_TINT64` | 64 位整数 | | `SQL_BINARY` | `TSL_TBINARY` | 二进制数据 | | `SQL_DOUBLE` | `TSL_TNUMBER` | 64 位浮点数 | | `SQL_INTEGER` | `TSL_TINT` | 32 位整数 | | `SQL_VARCHAR` | `TSL_TSZSTRING` | ANSI 或 Unicode 字符串 | | `SQL_TIMESTAMP` | `TSL_TNUMBER` | 由 DSN 日期时间规则识别的 TSL 数值 | ## DSN 配置项 | 配置项 | 说明 | | ---------------------------- | ---------------------------------- | | `DSN` | 数据源名称 | | `HOST` / `PORT` | 天软服务器地址和端口 | | `USERNAME` / `PASSWORD` | 登录账号与密码 | | `DATETIMECOLUMNAUTO` | 是否自动识别日期时间列 | | `DATETIMECOLUMNLIST` | 强制按日期时间处理的列名或列号列表 | | `DATETIMECOLUMNREGEXP` | 日期时间列名正则表达式 | | `TASKADMINROW` | TaskAdmin 字符串按一行或多行返回 | | `CONNECTPROXY` | 是否通过代理服务器连接 | | `PROXYADDRESS` / `PROXYPORT` | 代理服务器地址和端口 | | `PROXYUSER` / `PROXYPASS` | 代理服务器用户名和密码 | ## 调用案例 ### Python 参数调用 ```python import pyodbc connection = pyodbc.connect("dsn=t1") cursor = connection.cursor() cursor.execute( "setsysparam(pn_stock(), {?}); " "setsysparam(pn_date(), today()); " "return nday({?}, 'date', datetimetostr(sp_time()), " "'open', open(), 'close', close());", "SZ000002", 30, ) rows = cursor.fetchall() cursor.close() connection.close() print(rows) ``` ### R 调用 ```r library(RODBC) channel <- odbcConnect("t1") sql_text <- paste0( "setsysparam(pn_stock(),'SZ000002'); ", "setsysparam(pn_date(),today()); ", "return nday(30,'date',datetimetostr(sp_time()),", "'open',open(),'close',close());" ) result <- sqlQuery(channel, sql_text) odbcClose(channel) print(result) ```