使用odbc的mysql驱动插入数据时总是报object type error

【产品名称】

【产品版本】mysql的驱动5.3版本 oceabase的版本2.77

【问题描述】使用odbc 用mysql胡驱动插入数据

插入第一条记录总是报object type error,但是后面的记录全都能插入进去。

请问方便发一下你的代码吗?或者你写一个简单版本的测试代码

代码大概是这样:

1:定义sql语句replace into TableName (name, age) values(?, ?);

2:SQLPrepare(sql)

3:for

   SQLBindParameter 绑定参数

SQLExecute 然后执行语句

就会报错:object type error  数据导入失败

循环第二次导入下一条数据就会成功,不报失败。


因此结果就是,导入失败,但是会有数据进入数据库,但是总会缺少第一条记录。





方便提供一下报错日志吗,如果错误信息为Object type error,observer日志里应该有"ret=--4001"的日志

[2021-09-14 08:00:09.774905] WARN [SQL.PARSER] parsesql (obparser.cpp:184) [281][462][YB427F000001-0005CBE292936404] [lt=23] [dc=0] failed to parse the statement(stmt=set identityinsert ANNOUNCEMENTOBJECT on, parseresult.isfp=false, parseresult.ismultiquery=false, parseresult.yyscaninfo=0x7f49e8ed40e8, parseresult.resulttree=NULL, parseresult.mallocpool=0x7f4ae3047a70, message="syntax error, unexpected NAMEOB, expecting SETVAR or COMPEQ or TO", startcol=21, endcol=38, parseresult.line=0, parseresult.yycolumn=39, parseresult.yylineno=1, parseresult.extraerrno=0, errchargesqlmode=false, sqlmode=4194304, parseresult.sqlmode=4194304, parseresult.mayboolvalue_=false, ret=-5001)

[2021-09-14 08:00:09.774930] WARN parse_sql (ob_parser.cpp:194) [281][462][YB427F000001-0005CBE292936404] [lt=22] [dc=0] You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'ANNOUNCEMENTOBJECT on' at line 1

[2021-09-14 08:00:09.774941] WARN [SQL.PARSER] parse (ob_parser.cpp:266) [281][462][YB427F000001-0005CBE292936404] [lt=9] [dc=0] failed to parse stmt as sql(stmt=set identity_insert ANNOUNCEMENTOBJECT on, parse_mode=0, ret=-5001)


应该是在绑定NULL参数的时候出错;

SQLRETURN SQLBindParameter(


   SQLHSTMT    StatementHandle,   // statement句柄

   SQLUSMALLINT  ParameterNumber,  // 参数位于语句中的序号,最小为1

   SQLSMALLINT   InputOutputType,  // 入参/出参类型标识[1]

   SQLSMALLINT   ValueType,     // 对应的C数据类型标识[2]

   SQLSMALLINT   ParameterType,   // 对应的SQL数据类型标识[2]

   SQLULEN     ColumnSize,     // 对应字段长度

   SQLSMALLINT   DecimalDigits,    // 如果是浮点数,则对应字段精度

   SQLPOINTER   ParameterValuePtr,  // 参数缓存

   SQLLEN     BufferLength,    // 参数缓存字节数

   SQLLEN *    StrLenorIndPtr);  // 用于表示字符串长度或NULL值的标识[3]

StrLenorIndPtr的值为SQLNULLDATA的时候出错