gpt4 book ai didi

mysql - C 中的存储过程 - 输出参数的问题。我该如何使用字符串?

转载 作者:行者123 更新时间:2023-11-30 21:05:00 25 4
gpt4 key购买 nike

我应用了此代码https://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-call-statements.html .

如果我使用 int 输出变量就可以了。但是 MYSQL_TYPE_STRING 该怎么办呢?将这个案例添加到其他案例中还不够。有什么建议吗?

我必须管理 TIME 和 STRING MYSQL_TYPE。

与此代码类似,我必须添加什么代码?

/* process results until there are no more */
do {
int i;
int num_fields; /* number of columns in result */
MYSQL_FIELD *fields; /* for result set metadata */
MYSQL_BIND *rs_bind; /* for output buffers */

/* the column count is > 0 if there is a result set */
/* 0 if the result is only the final status packet */
num_fields = mysql_stmt_field_count(stmt);

if (num_fields > 0)
{
/* there is a result set to fetch */
printf("Number of columns in result: %d\n", (int) num_fields);

/* what kind of result set is this? */
printf("Data: ");
if(con->server_status & SERVER_PS_OUT_PARAMS)
printf("this result set contains OUT/INOUT parameters\n");
else
printf("this result set is produced by the procedure\n");

MYSQL_RES *rs_metadata = mysql_stmt_result_metadata(stmt);
test_stmt_error(stmt, rs_metadata == NULL);

fields = mysql_fetch_fields(rs_metadata);

rs_bind = (MYSQL_BIND *) malloc(sizeof (MYSQL_BIND) * num_fields);
if (!rs_bind)
{
printf("Cannot allocate output buffers\n");
exit(1);
}
memset(rs_bind, 0, sizeof (MYSQL_BIND) * num_fields);

/* set up and bind result set output buffers */
for (i = 0; i < num_fields; ++i)
{
rs_bind[i].buffer_type = fields[i].type;
rs_bind[i].is_null = &is_null[i];

switch (fields[i].type)
{
case MYSQL_TYPE_LONG:
rs_bind[i].buffer = (char *) &(int_data[i]);
rs_bind[i].buffer_length = sizeof (int_data);
break;

case MYSQL_TYPE_STRING:
rs_bind[i].buffer = &(char_data[i]);
rs_bind[i].buffer_length = sizeof (char_data);
break;

case MYSQL_TYPE_TIME:
rs_bind[i].buffer = (char *) &(char_data[i]);
rs_bind[i].buffer_length = sizeof (char_data);
break;

default:
fprintf(stderr, "ERROR: unexpected type: %d.\n", fields[i].type);
//exit(1);
}
}

status = mysql_stmt_bind_result(stmt, rs_bind);
test_stmt_error(stmt, status);

/* fetch and display result set rows */
while (1)
{
status = mysql_stmt_fetch(stmt);

if (status == 1 || status == MYSQL_NO_DATA)
break;

printf("%p,%lld,%s,%m,%m",rs_bind[0].buffer,rs_bind[1].buffer,rs_bind[2].buffer,rs_bind[3].buffer,rs_bind[4].buffer);
for (i = 0; i < num_fields; ++i)
{
switch (rs_bind[i].buffer_type)
{
case MYSQL_TYPE_LONG:
if (*rs_bind[i].is_null)
printf(" val[%d] = NULL;", i);
else
printf(" val[%d] = %ld;",
i, (long) *((int *) rs_bind[i].buffer));
break;

case MYSQL_TYPE_STRING:
if (*rs_bind[i].is_null)
printf(" val[%d] = NULL;", i);
else
printf(" val[%d] = %s;",
i, rs_bind[i].buffer);
break;

case MYSQL_TYPE_TIME:
if (*rs_bind[i].is_null)
printf(" val[%d] = NULL;", i);
else
printf(" val[%d] = %s;",
i, rs_bind[i].buffer);
break;

default:
printf(" unexpected type (%d)\n",
rs_bind[i].buffer_type);
}
}
printf("\n");
}

mysql_free_result(rs_metadata); /* free metadata */
free(rs_bind); /* free output buffers */
}
else
{
/* no columns = final status packet */
printf("End of procedure output\n");
}

/* more results? -1 = no, >0 = error, 0 = yes (keep looking) */
status = mysql_stmt_next_result(stmt);
if (status > 0)
test_stmt_error(stmt, status);
} while (status == 0);

最佳答案

您的代码仅处理LONG-数据类型(case MYSQL_TYPE_LONG),但您的调用返回BIGINT(MYSQL_TYPE_LONGLONG) = 8)。您的 switch 语句应该处理您使用的所有数据类型。

关于mysql - C 中的存储过程 - 输出参数的问题。我该如何使用字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com