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

问题描述 投票:-3回答:1

我应用了此代码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);
mysql c linux mysql-workbench
1个回答
0
投票

您的代码仅处理LONG-数据类型(case MYSQL_TYPE_LONG),但是您的呼叫返回BIGINTMYSQL_TYPE_LONGLONG = 8)。您的切换语句应处理您使用的所有数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.