批量插入失败。 代码:-700原因:对于多行SQLDA,SQLDA字段不一致

2020-09-24 10:18发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)专家们, 我正在测试SQL A...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我正在测试SQL Anywhere17的sacapi,我的测试版本是" SQLA17Developer.exe"。

使用NULL值批量插入时,失败,并显示"代码:-700原因:多行SQLDA的SQLDA字段不一致"。

我将col#val1.is_null [row_no] = 1设置为第2行,col#1为NULL。

出问题了吗?

这是源代码:

<

#include

#include

#include

#include" sacapidll.h"

SQLAnywhereInterface api;

//创建表andy.t_varchar(id整数,名称varchar(40));

void testBatchInsert(a_sqlany_connection * sqlany_conn)

{a_sqlany_stmt * stmt = NULL;

字符原因[SACAPI_ERROR_SIZE];

int码= 0;

stmt = api.sqlany_prepare(sqlany_conn,"插入andy.t_varchar(id,name)values(?,?)"));

如果(stmt == NULL)

{代码= api.sqlany_error(sqlany_conn,原因,sizeof(原因));

printf(" stmt解析失败。代码:%d原因:%s \ n",代码,原因); 返回; }

//将批量大小设置为3

const int batch_size = 3;

//1。 绑定参数

const int param_cnt = 2;

a_sqlany_bind_param param0;

a_sqlany_bind_param param1;

//api.sqlany_describe_bind_param(stmt,0,¶m0);

param0.direction = DD_INPUT;

a_sqlany_data_value&col_val0 = param0.value;

col_val0.is_null =新的sacapi_bool [batch_size];

col_val0.is_address = 0;

col_val0.length =新的size_t [batch_size];

col_val0.type = A_UVAL32;

col_val0.buffer_size = sizeof(unsigned int);

col_val0.buffer =新字符[batch_size * col_val0.buffer_size];

表示(int batch_no = 0; batch_no

{col_val0.length [batch_no] = col_val0.buffer_size;

col_val0.is_null [batch_no] = 0; }

api.sqlany_bind_param(stmt,0,¶m0);

//api.sqlany_describe_bind_param(stmt,1,¶m1);

param1.direction = DD_INPUT;

a_sqlany_data_value&col_val1 = param1.value;

col_val1.is_null =新的sacapi_bool [batch_size];

col_val1.is_address = 0;

col_val1.length =新的size_t [batch_size];

col_val1.type = A_STRING;

col_val1.buffer_size = 64;

col_val1.buffer =新字符[batch_size * col_val1.buffer_size];

表示(int batch_no = 0; batch_no

{col_val1.length [batch_no] = 0;

col_val1.is_null [batch_no] = 0; }

api.sqlany_bind_param(stmt,1,¶m1);

//2。 设置数组值

char s_val [128];

int len = 0;

int row_no = 0;

//第0行

row_no = 0;

col_val0.is_null [row_no] = 0; //不为空

*(((无符号整数*)col_val0.buffer + row_no)= row_no;

col_val1.is_null [row_no] = 0;//不为空

sprintf(s_val," str val%u",row_no);

len = strlen(s_val);

memcpy(col_val1.buffer + row_no * col_val1.buffer_size,s_val,len); col_val1.length [row_no] = len;

//第1行

row_no = 1;

col_val0.is_null [row_no] = 0; //不为空

*(((无符号整数*)col_val0.buffer + row_no)= row_no;

col_val1.is_null [row_no] = 0;//不为空

sprintf(s_val," str val%u",row_no);

len = strlen(s_val);

memcpy(col_val1.buffer + row_no * col_val1.buffer_size,s_val,len); col_val1.length [row_no] = len;

//第2行

row_no = 2;

col_val0.is_null [row_no] = 0; //不为空

*(((无符号整数*)col_val0.buffer + row_no)= row_no;

col_val1.is_null [row_no] = 1;//此列值为NULL,报告"批处理stmt失败。代码:-700原因:对于多行SQLDA,SQLDA字段不一致"

sprintf(s_val," str val%u",row_no);

len = strlen(s_val);

memcpy(col_val1.buffer + row_no * col_val1.buffer_size,s_val,len); col_val1.length [row_no] = len;

//3。 执行

sacapi_bool success_execute = api.sqlany_set_batch_size(stmt,batch_size);

如果(!api.sqlany_execute(stmt))

{代码= api.sqlany_error(sqlany_conn,原因,sizeof(原因));

printf("批处理stmt失败。代码:%d原因:%s \ n",代码,原因); }

其他{

int row_cnt = api.sqlany_affected_rows(stmt);

printf("批处理插入[%u]好。\ n",row_cnt); }//提交

如果(!api.sqlany_commit(sqlany_conn))

{

code = api.sqlany_error(sqlany_conn,原因,sizeof(原因));

printf("提交失败。代码:%d原因:%s \ n",代码,原因);

}

api.sqlany_free_stmt(stmt);

}

>

1条回答
落灬小鱼
2020-09-24 10:52

如果查看安装的。\ SDK \ dbcapi \ examples文件夹下的prepare_statements.cpp示例,您将看到以下行:

 param.value.is_null = NULL; //如果对可空性不感兴趣,请使用NULL 

因此,我认为您的问题来自于事实,即将col_val1定义为第0行和第1行的NOT NULL(able)和第2行的NULL(able)。这是两种不同的数据类型。 如果您希望能够切换IS_NULL,我认为您需要设置

 col_val1.is_null = NULL; 

我还没有测试过,但是请尝试一下。

此致

Mike Loop
SAP高级支持工程师
SAP产品支持

一周热门 更多>