mysql_execute()
int mysql_execute(MYSQL_STMT *stmt)
.
Descrição
mysql_execute()
executa a consulta preparada associada ao controlador de instruções. O valor atual do marcador de parâmetros é enviado para o servidor durante esta chamada, e o servidor substituir marcadores com os novos dados fornecidos.
Se a instrução é um UPDATE
, DELETE
ou INSERT
, o número total de registros altrados, deletados ou inseridos pode ser encontrado chamando mysql_stmt_affected_rows()
. Se este é um resultado de uma consulta como SELECT
, deve se chamar mysql_fetch()
para buscar dados previamente para fazer qualquer outra função que resulte em um processamento de consulta. Para mais informações sobre como buscar os resultados, consulte "mysql_fetch()
"
Valor Retornado
Zero se a execução obteve sicesso. Diferente de zero se ocorreu um erro. O código de erro e a mensagem podem ser obtidas chamando mysql_stmt_errno()
e mysql_stmt_error()
.
Erros
CR_NO_PREPARE_QUERY
Nenhuma consulta preprada previamente para execução
CR_ALL_PARAMS_NOT_BOUND
Não forma fornecidos todos os dados de parâmetros.
CR_COMMANDS_OUT_OF_SYNC
Os comando foram executados em uma ordem inpropriada.
CR_OUT_OF_MEMORY
Falta de memória
CR_SERVER_GONE_ERROR
O servidor MariaDB foi finalizado.
CR_SERVER_LOST
A conexão ao servidor MariaDB foi perdida durante a consulta.
CR_UNKNOWN_ERROR
Um erro desconhecido ocorreu.
Exemplo
O seguinte exemplo demonstra como criar e preencher uma tabela usando mysql_prepare()
, mysql_param_count()
, mysql_bind_param()
, mysql_execute()
e mysql_stmt_affected_rows()
. A variável MariaDB
é considerada como um controlador de conexão válido.
#define STRING_SIZE 50 #define DROP_SAMPLE_TABLE 'DROP TABLE IF EXISTS test_table' #define CREATE_SAMPLE_TABLE 'CREATE TABLE test_table(col1 INT,\ col2 VARCHAR(40),\ col3 SMALLINT,\ col4 TIMESTAMP)' #define INSERT_SAMPLE 'INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)' MYSQL_STMT *stmt; MYSQL_BIND bind[3]; my_ulonglong affected_rows; int param_count; short small_data; int int_data; char str_data[STRING_SIZE]; unsigned long str_length; my_bool is_null; if (mysql_query(mysql, DROP_SAMPLE_TABLE)) { fprintf(stderr, ' DROP TABLE failed\n'); fprintf(stderr, ' %s\n', mysql_error(mysql)); exit(0); } if (mysql_query(mysql, CREATE_SAMPLE_TABLE)) { fprintf(stderr, ' CREATE TABLE failed\n'); fprintf(stderr, ' %s\n', mysql_error(mysql)); exit(0); } /* Prepare an INSERT query with 3 parameters */ /* (the TIMESTAMP column is not named; it will */ /* be set to the current date and time) */ stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE)); if (!stmt) { fprintf(stderr, ' mysql_prepare(), INSERT failed\n'); fprintf(stderr, ' %s\n', mysql_error(mysql)); exit(0); } fprintf(stdout, ' prepare, INSERT successful\n'); /* Get the parameter count from the statement */ param_count= mysql_param_count(stmt); fprintf(stdout, ' total parameters in INSERT: %d\n', param_count); if (param_count != 3) /* validate parameter count */ { fprintf(stderr, ' invalid parameter count returned by MySQL\n'); exit(0); } /* Bind the data for all 3 parameters */ /* INTEGER PARAM */ /* This is a number type, so there is no need to specify buffer_length */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= 0; bind[0].length= 0; /* STRING PARAM */ bind[1].buffer_type= MYSQL_TYPE_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= 0; bind[1].length= &str_length; /* SMALLINT PARAM */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null; bind[2].length= 0; /* Bind the buffers */ if (mysql_bind_param(stmt, bind)) { fprintf(stderr, ' mysql_bind_param() failed\n'); fprintf(stderr, ' %s\n', mysql_stmt_error(stmt)); exit(0); } /* Specify the data values for the first row */ int_data= 10; /* integer */ strncpy(str_data, 'MySQL', STRING_SIZE); /* string */ str_length= strlen(str_data); /* INSERT SMALLINT data as NULL */ is_null= 1; /* Execute the INSERT statement - 1*/ if (mysql_execute(stmt)) { fprintf(stderr, ' mysql_execute(), 1 failed\n'); fprintf(stderr, ' %s\n', mysql_stmt_error(stmt)); exit(0); } /* Get the total number of affected rows */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, ' total affected rows(insert 1): %ld\n', affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, ' invalid affected rows by MySQL\n'); exit(0); } /* Specify data values for second row, then re-execute the statement */ int_data= 1000; strncpy(str_data, 'The most popular open source database', STRING_SIZE); str_length= strlen(str_data); small_data= 1000; /* smallint */ is_null= 0; /* reset */ /* Execute the INSERT statement - 2*/ if (mysql_execute(stmt)) { fprintf(stderr, ' mysql_execute, 2 failed\n'); fprintf(stderr, ' %s\n', mysql_stmt_error(stmt)); exit(0); } /* Get the total rows affected */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, ' total affected rows(insert 2): %ld\n', affected_rows); if (affected_rows != 1) /* validate affected rows */ { fprintf(stderr, ' invalid affected rows by MySQL\n'); exit(0); } /* Close the statement */ if (mysql_stmt_close(stmt)) { fprintf(stderr, ' failed while closing the statement\n'); fprintf(stderr, ' %s\n', mysql_stmt_error(stmt)); exit(0); }
Nota: Para exemplos completos do uso das funções de instruções preparadas, veja tests/mysql_client_test.c
. Este arquivo pode ser obtido em uma distribuição fonte ou do repositório do Bitkeeper.