質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1870閲覧

MySQL C APIを利用したCプログラム実行中での問題点と解決策

SeWonHwang

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/04/16 16:02

MySQL C APIを利用したCプログラムです。 多くの問題がありますが、 それらと適切な解決策があれば教えてください。

ソースコードは以下になります。

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { MYSQL *m; MYSQL_RES *r; MYSQL_ROW w; MYSQL_STMT *s; MYSQL_BIND par[2]; MYSQL_BIND res[2]; char sd[4][60]; unsigned long sdl[4]; my_bool nl[4]; char sql1[]= "SELECT user, host FROM mysql.user WHERE host LIKE '%localhost%'"; char sql2[]= "SELECT user, host FROM mysql.user WHERE host LIKE ?"; mysql_real_connect(m,"localhost","root","","test",0,NULL,0); puts("Regular Execution"); mysql_real_query(m, sql1, strlen(sql1)); r= mysql_store_result(m); while (w= mysql_fetch_row) { printf("%s@%s\n", w[0], w[1]); } puts("Prepared Statement"); mysql_stmt_prepare(s, sql2, strlen(sql2)); // parameter par[0].buffer_type= MYSQL_TYPE_STRING; par[0].buffer= sd[0]; par[0].is_null= 0; par[0].length= &sdl[0]; mysql_stmt_bind_param(s,par); strncpy(sd[0],"%localhost%",60); sdl[0]= strlen(sd[0]); mysql_stmt_execute(s); res[0].buffer_type= MYSQL_TYPE_STRING; res[0].buffer= sd[1]; res[0].buffer_length= 60; res[0].is_null= &nl[1]; res[0].length= &sdl[1]; res[1].buffer_type= MYSQL_TYPE_STRING; res[1].buffer= sd[2]; res[1].buffer_length= 60; res[1].is_null= &nl[2]; res[1].length= &sdl[2]; mysql_stmt_bind_result(s,res); while(w= mysql_fetch_row(r)) { printf("%s@%s\n", sd[1], sd[2]); } mysql_stmt_free_result(s); mysql_stmt_close(s); mysql_close(m); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroshiWatanabe

2017/04/17 00:52

何がどう問題なのかが書いてないよ
guest

回答1

0

同じ様なプログラムを作成してみました。こちらのサイトのexampleを参考としました。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <mysql.h> 5#define STRING_SIZE 50 6 7int main(char **args) { 8 MYSQL_RES *result; 9 MYSQL_ROW row; 10 MYSQL_STMT *stmt; 11 MYSQL mysql; 12 MYSQL_BIND par[1]; 13 MYSQL_BIND res[2]; 14 int state; 15 unsigned long str_leng; 16 17 mysql_init(&mysql); 18 mysql_real_connect(&mysql,"localhost", "root", "passwd","", 0, 0, 0); 19 if (&mysql == NULL) { 20 printf(mysql_error(&mysql)); 21 return 1; 22 } 23 puts("==== Regular Execution ===="); 24 fflush( stdout ); 25 26 char sql1[]= "SELECT user, host FROM mysql.user WHERE host LIKE '%localhost%'"; 27 state = mysql_query(&mysql, sql1); 28 if (state != 0) { 29 printf(mysql_error(&mysql)); 30 return 1; 31 } 32 33 result = mysql_store_result(&mysql); 34 printf("Rows: %d\n", mysql_num_rows(result)); 35 36 while ( ( row = mysql_fetch_row(result)) != NULL ) { 37 printf("%s@%s\n", row[0], row[1]); 38 } 39 mysql_free_result(result); 40 41 puts("==== Prepared Statement ===="); 42 stmt = mysql_stmt_init(&mysql); 43 if (!stmt) { 44 fprintf(stderr, " mysql_stmt_init(), out of memory\n"); 45 exit(0); 46 } 47 48 char sql2[] = "SELECT user, host FROM mysql.user WHERE host LIKE ?"; 49 if (mysql_stmt_prepare(stmt, sql2, strlen(sql2))){ 50 fprintf(stderr, " mysql_stmt_prepare(), prepare failed\n"); 51 fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 52 exit(0); 53 } 54 55 // parameter 56 char sd[20] = "%localhost%"; 57 memset(par, 0, sizeof(par)); 58 par[0].buffer_type= MYSQL_TYPE_STRING; 59 par[0].buffer= (char *)sd; 60 par[0].buffer_length= STRING_SIZE; 61 par[0].is_null= 0; 62 par[0].length= &str_leng; 63 if (mysql_stmt_bind_param(stmt,par)){ 64 fprintf(stderr, " mysql_stmt_bind_param() failed\n"); 65 fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 66 exit(0); 67 } 68 69 str_leng = strlen(sd); 70 if (mysql_stmt_execute(stmt)){ 71 fprintf(stderr, " mysql_stmt_execute(), failed\n"); 72 fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 73 exit(0); 74 } 75 76 char dat1[64]; 77 char dat2[64]; 78 memset(res, 0, sizeof(res)); 79 res[0].buffer_type= MYSQL_TYPE_STRING; 80 res[0].buffer= (char *)dat1; 81 res[0].is_null = 0; 82 res[0].buffer_length = 40; 83 res[1].buffer_type= MYSQL_TYPE_STRING; 84 res[1].buffer= (char *)dat2; 85 res[1].is_null = 0; 86 res[1].buffer_length = 40; 87 88 if (mysql_stmt_bind_result(stmt, res)){ 89 fprintf(stderr, " mysql_stmt_bind_result() failed\n"); 90 fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 91 exit(0); 92 } 93 94 if (mysql_stmt_store_result(stmt)){ 95 fprintf(stderr, " mysql_stmt_store_result() failed\n"); 96 fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 97 exit(0); 98 } 99 100 while(!mysql_stmt_fetch(stmt)) { 101 printf("%s@%s\n", dat1, dat2); 102 } 103 104 mysql_stmt_close(stmt); 105 mysql_close(&mysql); 106}

投稿2017/04/18 16:38

編集2017/04/19 04:52
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問