Files
playbook/skills/tsl-api-reference/references/codegen/module/tinyodbc.md
T
2026-08-14 17:15:41 +08:00

83 lines
3.4 KiB
Markdown

# 第三方交互 / 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)
```