Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
8d325f16
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1185
Star
22015
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8d325f16
编写于
10月 13, 2020
作者:
F
freemine
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1. support SQLWCHAR
2. more precise error message, according ODBC doc
上级
e88979de
变更
8
展开全部
隐藏空白更改
内联
并排
Showing
8 changed file
with
1122 addition
and
513 deletion
+1122
-513
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+56
-0
src/connector/odbc/src/todbc.c
src/connector/odbc/src/todbc.c
+716
-512
src/connector/odbc/src/todbc_util.c
src/connector/odbc/src/todbc_util.c
+226
-0
src/connector/odbc/src/todbc_util.h
src/connector/odbc/src/todbc_util.h
+52
-0
src/connector/odbc/tests/main.c
src/connector/odbc/tests/main.c
+1
-1
src/connector/odbc/tests/odbc.py
src/connector/odbc/tests/odbc.py
+44
-0
src/inc/taos.h
src/inc/taos.h
+17
-0
src/inc/taoserror.h
src/inc/taoserror.h
+10
-0
未找到文件。
src/client/src/tscPrepare.c
浏览文件 @
8d325f16
...
...
@@ -637,3 +637,59 @@ TAOS_RES *taos_stmt_use_result(TAOS_STMT* stmt) {
pStmt
->
pSql
=
NULL
;
return
result
;
}
int
taos_stmt_num_params
(
TAOS_STMT
*
stmt
,
int
*
nums
)
{
STscStmt
*
pStmt
=
(
STscStmt
*
)
stmt
;
if
(
stmt
==
NULL
||
pStmt
->
taos
==
NULL
||
pStmt
->
pSql
==
NULL
)
{
terrno
=
TSDB_CODE_TSC_DISCONNECTED
;
return
TSDB_CODE_TSC_DISCONNECTED
;
}
SSqlObj
*
pSql
=
pStmt
->
pSql
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
*
nums
=
pCmd
->
numOfParams
;
return
TSDB_CODE_SUCCESS
;
}
int
taos_stmt_get_param
(
TAOS_STMT
*
stmt
,
int
idx
,
int
*
type
,
int
*
bytes
)
{
STscStmt
*
pStmt
=
(
STscStmt
*
)
stmt
;
if
(
stmt
==
NULL
||
pStmt
->
taos
==
NULL
||
pStmt
->
pSql
==
NULL
)
{
terrno
=
TSDB_CODE_TSC_DISCONNECTED
;
return
TSDB_CODE_TSC_DISCONNECTED
;
}
SSqlObj
*
pSql
=
pStmt
->
pSql
;
SSqlCmd
*
pCmd
=
&
pSql
->
cmd
;
STableDataBlocks
*
pBlock
=
taosArrayGetP
(
pCmd
->
pDataBlocks
,
0
);
assert
(
pCmd
->
numOfParams
==
pBlock
->
numOfParams
);
if
(
idx
<
0
||
idx
>=
pBlock
->
numOfParams
)
return
-
1
;
SParamInfo
*
param
=
pBlock
->
params
+
idx
;
if
(
type
)
*
type
=
param
->
type
;
if
(
bytes
)
*
bytes
=
param
->
bytes
;
return
TSDB_CODE_SUCCESS
;
}
const
char
*
taos_data_type
(
int
type
)
{
switch
(
type
)
{
case
TSDB_DATA_TYPE_NULL
:
return
"TSDB_DATA_TYPE_NULL"
;
case
TSDB_DATA_TYPE_BOOL
:
return
"TSDB_DATA_TYPE_BOOL"
;
case
TSDB_DATA_TYPE_TINYINT
:
return
"TSDB_DATA_TYPE_TINYINT"
;
case
TSDB_DATA_TYPE_SMALLINT
:
return
"TSDB_DATA_TYPE_SMALLINT"
;
case
TSDB_DATA_TYPE_INT
:
return
"TSDB_DATA_TYPE_INT"
;
case
TSDB_DATA_TYPE_BIGINT
:
return
"TSDB_DATA_TYPE_BIGINT"
;
case
TSDB_DATA_TYPE_FLOAT
:
return
"TSDB_DATA_TYPE_FLOAT"
;
case
TSDB_DATA_TYPE_DOUBLE
:
return
"TSDB_DATA_TYPE_DOUBLE"
;
case
TSDB_DATA_TYPE_BINARY
:
return
"TSDB_DATA_TYPE_BINARY"
;
case
TSDB_DATA_TYPE_TIMESTAMP
:
return
"TSDB_DATA_TYPE_TIMESTAMP"
;
case
TSDB_DATA_TYPE_NCHAR
:
return
"TSDB_DATA_TYPE_NCHAR"
;
default:
return
"UNKNOWN"
;
}
}
src/connector/odbc/src/todbc.c
浏览文件 @
8d325f16
此差异已折叠。
点击以展开。
src/connector/odbc/src/todbc_util.c
0 → 100644
浏览文件 @
8d325f16
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "todbc_util.h"
#include "iconv.h"
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <stdlib.h>
#include <string.h>
const
char
*
sql_sql_type
(
int
type
)
{
switch
(
type
)
{
case
SQL_BIT
:
return
"SQL_BIT"
;
case
SQL_TINYINT
:
return
"SQL_TINYINT"
;
case
SQL_SMALLINT
:
return
"SQL_SMALLINT"
;
case
SQL_INTEGER
:
return
"SQL_INTEGER"
;
case
SQL_BIGINT
:
return
"SQL_BIGINT"
;
case
SQL_FLOAT
:
return
"SQL_FLOAT"
;
case
SQL_DOUBLE
:
return
"SQL_DOUBLE"
;
case
SQL_DECIMAL
:
return
"SQL_DECIMAL"
;
case
SQL_NUMERIC
:
return
"SQL_NUMERIC"
;
case
SQL_REAL
:
return
"SQL_REAL"
;
case
SQL_CHAR
:
return
"SQL_CHAR"
;
case
SQL_VARCHAR
:
return
"SQL_VARCHAR"
;
case
SQL_LONGVARCHAR
:
return
"SQL_LONGVARCHAR"
;
case
SQL_WCHAR
:
return
"SQL_WCHAR"
;
case
SQL_WVARCHAR
:
return
"SQL_WVARCHAR"
;
case
SQL_WLONGVARCHAR
:
return
"SQL_WLONGVARCHAR"
;
case
SQL_BINARY
:
return
"SQL_BINARY"
;
case
SQL_VARBINARY
:
return
"SQL_VARBINARY"
;
case
SQL_LONGVARBINARY
:
return
"SQL_LONGVARBINARY"
;
case
SQL_DATE
:
return
"SQL_DATE"
;
case
SQL_TIME
:
return
"SQL_TIME"
;
case
SQL_TIMESTAMP
:
return
"SQL_TIMESTAMP"
;
case
SQL_TYPE_DATE
:
return
"SQL_TYPE_DATE"
;
case
SQL_TYPE_TIME
:
return
"SQL_TYPE_TIME"
;
case
SQL_TYPE_TIMESTAMP
:
return
"SQL_TYPE_TIMESTAMP"
;
case
SQL_INTERVAL_MONTH
:
return
"SQL_INTERVAL_MONTH"
;
case
SQL_INTERVAL_YEAR
:
return
"SQL_INTERVAL_YEAR"
;
case
SQL_INTERVAL_YEAR_TO_MONTH
:
return
"SQL_INTERVAL_YEAR_TO_MONTH"
;
case
SQL_INTERVAL_DAY
:
return
"SQL_INTERVAL_DAY"
;
case
SQL_INTERVAL_HOUR
:
return
"SQL_INTERVAL_HOUR"
;
case
SQL_INTERVAL_MINUTE
:
return
"SQL_INTERVAL_MINUTE"
;
case
SQL_INTERVAL_SECOND
:
return
"SQL_INTERVAL_SECOND"
;
case
SQL_INTERVAL_DAY_TO_HOUR
:
return
"SQL_INTERVAL_DAY_TO_HOUR"
;
case
SQL_INTERVAL_DAY_TO_MINUTE
:
return
"SQL_INTERVAL_DAY_TO_MINUTE"
;
case
SQL_INTERVAL_DAY_TO_SECOND
:
return
"SQL_INTERVAL_DAY_TO_SECOND"
;
case
SQL_INTERVAL_HOUR_TO_MINUTE
:
return
"SQL_INTERVAL_HOUR_TO_MINUTE"
;
case
SQL_INTERVAL_HOUR_TO_SECOND
:
return
"SQL_INTERVAL_HOUR_TO_SECOND"
;
case
SQL_INTERVAL_MINUTE_TO_SECOND
:
return
"SQL_INTERVAL_MINUTE_TO_SECOND"
;
case
SQL_GUID
:
return
"SQL_GUID"
;
default:
return
"UNKNOWN"
;
}
}
const
char
*
sql_c_type
(
int
type
)
{
switch
(
type
)
{
case
SQL_C_CHAR
:
return
"SQL_C_CHAR"
;
case
SQL_C_WCHAR
:
return
"SQL_C_WCHAR"
;
case
SQL_C_SHORT
:
return
"SQL_C_SHORT"
;
case
SQL_C_SSHORT
:
return
"SQL_C_SSHORT"
;
case
SQL_C_USHORT
:
return
"SQL_C_USHORT"
;
case
SQL_C_LONG
:
return
"SQL_C_LONG"
;
case
SQL_C_SLONG
:
return
"SQL_C_SLONG"
;
case
SQL_C_ULONG
:
return
"SQL_C_ULONG"
;
case
SQL_C_FLOAT
:
return
"SQL_C_FLOAT"
;
case
SQL_C_DOUBLE
:
return
"SQL_C_DOUBLE"
;
case
SQL_C_BIT
:
return
"SQL_C_BIT"
;
case
SQL_C_TINYINT
:
return
"SQL_C_TINYINT"
;
case
SQL_C_STINYINT
:
return
"SQL_C_STINYINT"
;
case
SQL_C_UTINYINT
:
return
"SQL_C_UTINYINT"
;
case
SQL_C_SBIGINT
:
return
"SQL_C_SBIGINT"
;
case
SQL_C_UBIGINT
:
return
"SQL_C_UBIGINT"
;
case
SQL_C_BINARY
:
return
"SQL_C_BINARY"
;
case
SQL_C_DATE
:
return
"SQL_C_DATE"
;
case
SQL_C_TIME
:
return
"SQL_C_TIME"
;
case
SQL_C_TIMESTAMP
:
return
"SQL_C_TIMESTAMP"
;
case
SQL_C_TYPE_DATE
:
return
"SQL_C_TYPE_DATE"
;
case
SQL_C_TYPE_TIME
:
return
"SQL_C_TYPE_TIME"
;
case
SQL_C_TYPE_TIMESTAMP
:
return
"SQL_C_TYPE_TIMESTAMP"
;
case
SQL_C_NUMERIC
:
return
"SQL_C_NUMERIC"
;
case
SQL_C_GUID
:
return
"SQL_C_GUID"
;
default:
return
"UNKNOWN"
;
}
}
int
string_conv
(
const
char
*
fromcode
,
const
char
*
tocode
,
const
unsigned
char
*
src
,
size_t
sbytes
,
unsigned
char
*
dst
,
size_t
dbytes
,
size_t
*
consumed
,
size_t
*
generated
)
{
if
(
consumed
)
*
consumed
=
0
;
if
(
generated
)
*
generated
=
0
;
if
(
dbytes
<=
0
)
return
-
1
;
dst
[
0
]
=
'\0'
;
iconv_t
conv
=
iconv_open
(
tocode
,
fromcode
);
if
(
!
conv
)
return
-
1
;
int
r
=
0
;
do
{
char
*
s
=
(
char
*
)
src
;
char
*
d
=
(
char
*
)
dst
;
size_t
sl
=
sbytes
;
size_t
dl
=
dbytes
;
r
=
iconv
(
conv
,
&
s
,
&
sl
,
&
d
,
&
dl
);
*
d
=
'\0'
;
if
(
consumed
)
*
consumed
=
sbytes
-
sl
;
if
(
generated
)
*
generated
=
dbytes
-
dl
;
}
while
(
0
);
iconv_close
(
conv
);
return
r
;
}
int
utf8_chars
(
const
char
*
src
)
{
const
char
*
fromcode
=
"UTF-8"
;
const
char
*
tocode
=
"UCS-2LE"
;
iconv_t
conv
=
iconv_open
(
tocode
,
fromcode
);
if
(
!
conv
)
return
-
1
;
size_t
slen
=
strlen
(
src
);
char
buf
[
4096
];
size_t
dlen
=
sizeof
(
buf
);
char
*
ps
=
(
char
*
)
src
;
char
*
pd
=
buf
;
iconv
(
conv
,
&
ps
,
&
slen
,
&
pd
,
&
dlen
);
DASSERT
(
slen
==
0
);
size_t
chars
=
(
sizeof
(
buf
)
-
dlen
)
/
2
;
iconv_close
(
conv
);
return
chars
;
}
unsigned
char
*
utf8_to_ucs4le
(
const
char
*
utf8
,
size_t
*
chars
)
{
const
char
*
tocode
=
"UCS-4LE"
;
const
char
*
fromcode
=
"UTF-8"
;
iconv_t
conv
=
iconv_open
(
tocode
,
fromcode
);
if
(
!
conv
)
return
NULL
;
unsigned
char
*
ucs4le
=
NULL
;
do
{
size_t
slen
=
strlen
(
utf8
);
size_t
dlen
=
slen
*
4
;
ucs4le
=
(
unsigned
char
*
)
malloc
(
dlen
+
1
);
if
(
!
ucs4le
)
break
;
char
*
src
=
(
char
*
)
utf8
;
char
*
dst
=
(
char
*
)
ucs4le
;
size_t
s
=
slen
;
size_t
d
=
dlen
;
iconv
(
conv
,
&
src
,
&
s
,
&
dst
,
&
d
);
dst
[
0
]
=
'\0'
;
if
(
chars
)
*
chars
=
(
dlen
-
d
)
/
4
;
}
while
(
0
);
iconv_close
(
conv
);
return
ucs4le
;
}
char
*
ucs4le_to_utf8
(
const
unsigned
char
*
ucs4le
,
size_t
slen
,
size_t
*
chars
)
{
const
char
*
fromcode
=
"UCS-4LE"
;
const
char
*
tocode
=
"UTF-8"
;
iconv_t
conv
=
iconv_open
(
tocode
,
fromcode
);
if
(
!
conv
)
return
NULL
;
char
*
utf8
=
NULL
;
do
{
size_t
dlen
=
slen
;
utf8
=
(
char
*
)
malloc
(
dlen
+
1
);
if
(
!
utf8
)
break
;
char
*
dst
=
utf8
;
char
*
src
=
(
char
*
)
ucs4le
;
size_t
s
=
slen
;
size_t
d
=
dlen
;
iconv
(
conv
,
&
src
,
&
s
,
&
dst
,
&
d
);
dst
[
0
]
=
'\0'
;
if
(
chars
)
*
chars
=
(
slen
-
s
)
/
4
;
}
while
(
0
);
iconv_close
(
conv
);
return
utf8
;
}
SQLCHAR
*
wchars_to_chars
(
const
SQLWCHAR
*
wchars
,
size_t
chs
,
size_t
*
bytes
)
{
size_t
dlen
=
chs
*
4
;
SQLCHAR
*
dst
=
(
SQLCHAR
*
)
malloc
(
dlen
+
1
);
if
(
!
dst
)
return
NULL
;
string_conv
(
"UCS-2LE"
,
"UTF-8"
,
(
const
unsigned
char
*
)
wchars
,
chs
*
sizeof
(
*
wchars
),
dst
,
dlen
+
1
,
NULL
,
bytes
);
return
dst
;
}
src/connector/odbc/src/todbc_util.h
0 → 100644
浏览文件 @
8d325f16
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TODBC_UTIL_H_
#define _TODBC_UTIL_H_
#include <libgen.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#define D(fmt, ...) \
fprintf(stderr, \
"%s[%d]:%s() " fmt "\n", \
basename((char*)__FILE__), __LINE__, __func__, \
##__VA_ARGS__)
#define DASSERT(statement) \
do { \
if (statement) break; \
D("Assertion failure: %s", #statement); \
abort(); \
} while (0)
const
char
*
sql_sql_type
(
int
type
);
const
char
*
sql_c_type
(
int
type
);
int
string_conv
(
const
char
*
fromcode
,
const
char
*
tocode
,
const
unsigned
char
*
src
,
size_t
sbytes
,
unsigned
char
*
dst
,
size_t
dbytes
,
size_t
*
consumed
,
size_t
*
generated
);
int
utf8_chars
(
const
char
*
src
);
unsigned
char
*
utf8_to_ucs4le
(
const
char
*
utf8
,
size_t
*
chars
);
char
*
ucs4le_to_utf8
(
const
unsigned
char
*
ucs4le
,
size_t
slen
,
size_t
*
chars
);
SQLCHAR
*
wchars_to_chars
(
const
SQLWCHAR
*
wchars
,
size_t
chs
,
size_t
*
bytes
);
#endif // _TODBC_UTIL_H_
src/connector/odbc/tests/main.c
浏览文件 @
8d325f16
...
...
@@ -193,7 +193,7 @@ int main(int argc, char *argv[]) {
data
.
f8
=
9999999
.
999999
;
memset
(
data
.
bin
,
0
,
sizeof
(
data
.
bin
));
memset
(
data
.
blob
,
0
,
sizeof
(
data
.
blob
));
snprintf
(
data
.
bin
,
sizeof
(
data
.
bin
),
"hello"
);
snprintf
(
data
.
bin
,
sizeof
(
data
.
bin
),
"hel
我
lo"
);
snprintf
(
data
.
blob
,
sizeof
(
data
.
blob
),
"world"
);
snprintf
(
data
.
blob
,
sizeof
(
data
.
blob
),
"wo人rld"
);
SQLHSTMT
stmt
=
{
0
};
...
...
src/connector/odbc/tests/odbc.py
浏览文件 @
8d325f16
...
...
@@ -9,4 +9,48 @@ row = cursor.fetchone()
while
row
:
print
(
row
)
row
=
cursor
.
fetchone
()
cursor
.
close
()
#cursor = cnxn.cursor()
#cursor.execute("""
#INSERT INTO db.t values (?,?,?,?,?,?,?,?,?,?)
#""",
#"2020-12-12 00:00:00",
#1,
#27,
#32767,
#147483647,
#223372036854775807,
#23.456,
#899.999999,
#"foo",
#"bar")
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"drop database if exists db"
);
cursor
.
close
()
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"create database db"
);
cursor
.
close
()
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"create table db.t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin binary(40), blob nchar(10))"
);
cursor
.
close
()
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"insert into db.t values('2020-10-13 06:44:00', 1, 127, 32767, 32768, 32769, 123.456, 789.987, 'hello', 'world')"
)
cursor
.
close
()
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"insert into db.t values(?,?,?,?,?,?,?,?,?,?)"
,
"2020-10-13 07:06:00"
,
0
,
127
,
32767
,
32768
,
32769
,
123.456
,
789.987
,
"hel后lo"
,
"wo哈rld"
);
cursor
.
close
()
cursor
=
cnxn
.
cursor
()
cursor
.
execute
(
"SELECT * from db.t"
)
row
=
cursor
.
fetchone
()
while
row
:
print
(
row
)
row
=
cursor
.
fetchone
()
cursor
.
close
()
src/inc/taos.h
浏览文件 @
8d325f16
...
...
@@ -69,6 +69,8 @@ DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...);
DLL_EXPORT
TAOS
*
taos_connect
(
const
char
*
ip
,
const
char
*
user
,
const
char
*
pass
,
const
char
*
db
,
uint16_t
port
);
DLL_EXPORT
void
taos_close
(
TAOS
*
taos
);
const
char
*
taos_data_type
(
int
type
);
typedef
struct
TAOS_BIND
{
int
buffer_type
;
void
*
buffer
;
...
...
@@ -77,10 +79,25 @@ typedef struct TAOS_BIND {
int
*
is_null
;
int
is_unsigned
;
// unused
int
*
error
;
// unused
union
{
int64_t
ts
;
int8_t
b
;
int8_t
v1
;
int16_t
v2
;
int32_t
v4
;
int64_t
v8
;
float
f4
;
double
f8
;
unsigned
char
*
bin
;
char
*
nchar
;
}
u
;
unsigned
int
allocated
;
}
TAOS_BIND
;
TAOS_STMT
*
taos_stmt_init
(
TAOS
*
taos
);
int
taos_stmt_prepare
(
TAOS_STMT
*
stmt
,
const
char
*
sql
,
unsigned
long
length
);
int
taos_stmt_num_params
(
TAOS_STMT
*
stmt
,
int
*
nums
);
int
taos_stmt_get_param
(
TAOS_STMT
*
stmt
,
int
idx
,
int
*
type
,
int
*
bytes
);
int
taos_stmt_bind_param
(
TAOS_STMT
*
stmt
,
TAOS_BIND
*
bind
);
int
taos_stmt_add_batch
(
TAOS_STMT
*
stmt
);
int
taos_stmt_execute
(
TAOS_STMT
*
stmt
);
...
...
src/inc/taoserror.h
浏览文件 @
8d325f16
...
...
@@ -355,6 +355,16 @@ TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_OOM, 0, 0x2101, "out of mem
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_CONV_UNDEF
,
0
,
0x2102
,
"convertion undefined"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_CONV_TRUNC
,
0
,
0x2103
,
"convertion truncated"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_CONV_NOT_SUPPORT
,
0
,
0x2104
,
"convertion not supported"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_OUT_OF_RANGE
,
0
,
0x2105
,
"out of range"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_NOT_SUPPORT
,
0
,
0x2106
,
"not supported yet"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_INVALID_HANDLE
,
0
,
0x2107
,
"invalid handle"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_NO_RESULT
,
0
,
0x2108
,
"no result set"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_NO_FIELDS
,
0
,
0x2109
,
"no fields returned"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_INVALID_CURSOR
,
0
,
0x2110
,
"invalid cursor"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_STATEMENT_NOT_READY
,
0
,
0x2111
,
"statement not ready"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_CONNECTION_BUSY
,
0
,
0x2112
,
"connection still busy"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_ODBC_BAD_CONNSTR
,
0
,
0x2113
,
"bad connection string"
)
#ifdef TAOS_ERROR_C
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录