Spec-Zone.ru › MySQL Connectors 1.0

6.4.4 mysql_stmt_bind_named_param()

bool
mysql_stmt_bind_named_param(MYSQL_STMT *stmt,
                            MYSQL_BIND *binds,
                            unsigned n_params,
                            const char **names)

Описание

mysql_stmt_bind_named_param() настраивает параметры привязки, как именованные, так и безымянные (атрибуты запроса) для подготовленных запросов.

Эта функция заменяет старую функцию mysql_stmt_bind_param(), которая поддерживала только безымянные параметры и которая с тех пор была удалена.

Аргументы:

  • stmt: Дескриптор подготовленного запроса. Запросы должны быть подготовлены с помощью mysql_stmt_prepare().

  • binds: Массив именованных и безымянных параметров привязки. В отсутствие именованных параметров передайте NULL в качестве массива имён параметров привязки.

  • n_params: Количество элементов в массивах.

  • names: Массив имён параметров привязки.

mysql_stmt_bind_named_param() требует входного массива структур MYSQL_BIND и соответствующего массива имён. Функция завершается без каких-либо эффектов (в крайних случаях), если параметр количества аргументов привязки равен нулю или если указатель на массив привязки равен NULL. Функция завершается ошибкой, если для любого параметра привязки используется недопустимый тип MYSQL_BIND.

Для хранения как именованных, так и безымянных пользовательских переменных привязки, вызовите mysql_stmt_bind_named_param() после mysql_stmt_prepare(). После привязки переменных вы можете многократно устанавливать и изменять их.

Дополнительные действия, которые следует рассмотреть:

  • Выполните запрос с помощью mysql_stmt_execute().

  • Сбросьте запрос с помощью mysql_stmt_reset() или переподготовьте его с другим запросом с помощью mysql_stmt_prepare().

  • Закройте запрос с помощью mysql_stmt_close().

Для описания элементов структуры MYSQL_STMT и MYSQL_BIND и того, как их следует установить для предоставления входных значений, см. Раздел 6.2, «Структуры данных подготовленных запросов C API».

Значения возврата

Ноль в случае успеха. ненулевое значение, если произошла ошибка.

Ошибки

  • Преобразование не поддерживается. Возможно, значение buffer_type недействительно или не является одним из поддерживаемых типов.

  • Отсутствие памяти.

  • Произошла неизвестная ошибка.

Пример

В следующем примере показано связывание одного безымянного и одного именованного параметра. Безымянный параметр имеет NULL в соответствующем слоте массива имён:

// Compile example on Linux with a command similar to:
// gcc example.c --std=c99 -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -o example

#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {

  // variable declarations
  MYSQL *mysql;
  MYSQL_STMT *stmt;
  int int_data = 4;              // unnamed input parameter value
  int int_parentid = 1329494394; // named ('traceparent') input parameter value
  MYSQL_BIND params[2];
  const char *names[2] = {NULL, "traceparent"};
  int rc;

  MYSQL_BIND rbind[1];
  int result_val;

  // connect to the database server
  mysql = mysql_init(NULL);
  if (mysql == NULL) {
    fprintf(stderr, "%s\n", mysql_error(mysql));
    return 1;
  }
  if (mysql_real_connect(mysql, "127.0.0.1", "root", "password", NULL, 0, NULL,
                         0) == NULL) {
    fprintf(stderr, "%s\n", mysql_error(mysql));
    mysql_close(mysql);
    return 1;
  }

  // create a prepared statement
  stmt = mysql_stmt_init(mysql);
  if (stmt == NULL) {
    fprintf(stderr, "%s\n", mysql_error(mysql));
    mysql_close(mysql);
    return 1;
  }
  const char *query = "SELECT POW(?,2) AS square";
  if (mysql_stmt_prepare(stmt, query, strlen(query))) {
    mysql_stmt_close(stmt);
    mysql_close(mysql);
    return 1;
  }

  // bind the prepared statement parameters
  memset(params, 0, sizeof(params));

  params[0].buffer_type = MYSQL_TYPE_LONG;
  params[0].buffer = (char *)&int_data;
  params[0].length = NULL;
  params[0].is_null = NULL;

  params[1].buffer_type = MYSQL_TYPE_LONG;
  params[1].buffer = (char *)&int_parentid;
  params[1].length = NULL;
  params[1].is_null = NULL;

  rc = mysql_stmt_bind_named_param(stmt, params,
                                   sizeof(params) / sizeof(params[0]), names);
  if (rc != 0) {
    fprintf(stderr, "%s\n", mysql_error(mysql));
    mysql_stmt_close(stmt);
    mysql_close(mysql);
    return 1;
  }

  // execute the prepared statement
  rc = mysql_stmt_execute(stmt);
  if (rc != 0) {
    fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt),
            mysql_stmt_error(stmt));
    mysql_stmt_close(stmt);
    mysql_close(mysql);
    return 1;
  }

  // bind and fetch the result parameter
  memset(rbind, 0, sizeof(rbind));
  rbind[0].buffer_type = MYSQL_TYPE_LONG;
  rbind[0].buffer = (char *)&result_val;
  rc = mysql_stmt_bind_result(stmt, rbind);
  if (rc != 0) {
    fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt),
            mysql_stmt_error(stmt));
    mysql_stmt_close(stmt);
    mysql_close(mysql);
    return 1;
  }

  rc = mysql_stmt_fetch(stmt);
  if (rc != 0) {
    fprintf(stderr, "[%d] %s\n", mysql_stmt_errno(stmt),
            mysql_stmt_error(stmt));
    mysql_stmt_close(stmt);
    mysql_close(mysql);
    return 1;
  }

  // expect POW(4, 2), i.e. 4 squared being 16
  if (result_val != 16) {
    printf("Unexpected result!\n");
  } else {
    printf("Success!\n");
  }

  mysql_stmt_close(stmt);
  mysql_close(mysql);
  return 0;
}

После выполнения, привязки результатов и извлечения данных, результатом выполнения запроса при успехе является 16 (то есть 4 в квадрате).

См. также

См. mysql_stmt_send_long_data() для отправки длинных текстовых или блочных данных частями. Обратитесь к файлу tests/mysql_client_test.c для получения полных примеров. Этот файл можно получить из дистрибутива исходных кодов MySQL или из репозитория исходных кодов (см.).

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/c-api-8.4-en/mysql-stmt-bind-named-param.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API