83 lines
3.4 KiB
Markdown
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)
|
|
```
|