@@ -0,0 +1,82 @@
|
||||
# 第三方交互 / 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)
|
||||
```
|
||||
Reference in New Issue
Block a user