点击此处---> 群内免费提供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); 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);
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);
}
>
如果查看安装的。\ SDK \ dbcapi \ examples文件夹下的prepare_statements.cpp示例,您将看到以下行:
因此,我认为您的问题来自于事实,即将col_val1定义为第0行和第1行的NOT NULL(able)和第2行的NULL(able)。这是两种不同的数据类型。 如果您希望能够切换IS_NULL,我认为您需要设置
我还没有测试过,但是请尝试一下。
此致
Mike Loop
SAP高级支持工程师
SAP产品支持
一周热门 更多>