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

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

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

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

MySQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

2628閲覧

C言語:MYSQLを実行するプログラムでエラーが出ており困っております、助けてください

nagak

総合スコア16

C

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

MySQL

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2021/07/15 19:17

編集2021/07/16 03:11

環境
Linux Ubuntu 18.04
mariaDB
C言語

以下のC言語のプログラムを動かすと「Commands out of sync; you can't run this command now」というエラーが出ます。
おそらくMYSQLで不正な処理があると思っているのですが、初めてSQLのプログラムを書いたこともありどこが原因かわかりません。
どうか皆様のご教授していただきたいです、宜しくお願いいたします。

プログラムの簡単な説明をします。
ます以下のようなMYSQLのjoindata,taglistテーブルがあります。
taglistテーブルからtagを1つ取り出し、取り出したtagとjoindataテーブルのtagが一致する行を全て取り出し、tag名.csvを出力したいです。
出力先は、/tmp/splitdataディレクトリの中にa~z,otherディレクトリが用意してあるので、タグ名の1文字目に一致したディレクトリに出力したいです。

具体例を説明すると、taglistからdogを取り出した場合、joindataのtagで、dogの行をすべて取り出し、/tmp/splitdata/d/dog.csvを作りたいです。

c

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include "mysql/mysql.h" 5 6int main(void) 7{ 8 //MYSQLを利用するために必要な構造体 9 MYSQL *conn = NULL; //接続を表す構造体 10 MYSQL_RES *res = NULL;//SELECT文などの結果を表す構造体 11 MYSQL_ROW row; //MYSQL_RESの中の1レコードを示す構造体 12 13 char *sql_serv = ""; 14 char *user = ""; 15 char *passwd = ""; 16 char *db_name = ""; 17 unsigned int port = 3306; 18 19 char *firstLetter; //1文字目抽出用 20 char *query;//実行したいqueryを格納 21 22 // mysql接続 23 conn = mysql_init(NULL);//接続の初期化 24 mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8mb4");//オプションの文字コードを設定。 25 if (!mysql_real_connect(conn, sql_serv, user, passwd, db_name, port, NULL, 0)) 26 { 27 // error 28 fprintf(stderr, "%s\r\n", mysql_error(conn)); 29 exit(-1); 30 } 31 32 33 //query実行 34 35 // taglistテーブルから全tagを取得 36 if(mysql_query(conn,"select tag from taglist;")) 37 { 38 // error 39 fprintf(stderr, "%s\r\n", mysql_error(conn)); 40 exit(-1); 41 } 42 //queryの結果を取得 43 res = mysql_use_result(conn); 44 sprintf(query, "select latitude, longitude, time, url from jointag where tag = '%s' into outfile './splitdata/%s/%s.csv' fields terminated by ','", row, firstLetter, row);//実行したいqueryを書く 45 while(NULL != (row = mysql_fetch_row(res))){//NULLになるまで一行ずつrow取り出す 46 //row[0]の1文字目を抽出 47 strncpy(firstLetter, row[0], 1); 48 firstLetter[1]='\0'; 49 50 if ((firstLetter >= 'a' && firstLetter <= 'z') || (firstLetter >= 'A' && firstLetter <= 'Z')) 51 { //1文字目がアルファベット 52 if (mysql_query(conn, query)) 53 { 54 // error 55 fprintf(stderr, "%s\r\n", mysql_error(conn)); 56 exit(-1); 57 } 58 } 59 else 60 {//1文字目がアルファベット以外 61 firstLetter = "other"; 62 if (mysql_query(conn, query)) 63 { 64 // error 65 fprintf(stderr, "%s\r\n", mysql_error(conn)); 66 exit(-1); 67 } 68 } 69 } 70 71 //構造体を開放 72 if(NULL != res) 73 { 74 mysql_free_result(res); 75 } 76 77 // 接続切断 78 if(NULL != conn) 79 { 80 mysql_close(conn); 81 } 82 83 return 0; 84}

joindata

1列名:tag,latitude, longitude, time, url 2以下テーブルのデータ 3-------------------------------------------------------------------------- 4okanagan,48.947308,-119.439239,2013-07-30 23:57:51,http://farm7.static.flickr.com/6012/6001472815_87c26d4ed1.jpg 5moca,37.426,127.008,2013-07-30 23:57:47,http://farm8.static.flickr.com/7309/9407510864_0a63c471af.jpg 6gwacheon,37.426,127.008,2013-07-30 23:57:47,http://farm8.static.flickr.com/7309/9407510864_0a63c471af.jpg 789

taglist

1列名:tag 2以下テーブルのデータ 3-------------------------------------------------------------------------- 4apple 5dog 6diary 789

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/16 02:55

現時点までMUSQLの訂正なし。
guest

回答2

0

ご提示のコード中、ポインタを扱っている多くの関数の部分に言えますが、適切なアドレスを入れて初期化していないchar *ポインタを無造作に使っています。これではメモリ中のどこかが破壊されたままプログラムが続行し、いついかなる時に何が起きてもおかしくないです。

C

1... 2char *firstLetter; //1文字目抽出用 3char *query;//実行したいqueryを格納 4... 5 6/* 生成したSQL文字列を格納するバッファqueryは? 不定値が入ったままです */ 7sprintf(query, "select latitude, longitude, time, url from jointag where tag = '%s' into outfile './splitdata/%s/%s.csv' fields terminated by ','

上記に限らず、ポインタを扱っているところを再度見直しましょう。ポインタを宣言すれば常に自動的に領域が確保されたりアドレスがセットされる訳ではありません。この辺りはC言語のプログラミングの基本部分です。

投稿2021/07/16 01:07

dodox86

総合スコア9256

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

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

0

ベストアンサー

最初のSQLクエリーが閉じていない while ループの中で
更に別のSQLクエリーを実行しようとしているためかと思います。

Commands out of sync; you can't run this command now

MySQLの公式を見るとエラー内容があります。
https://dev.mysql.com/doc/refman/5.6/ja/mysql-store-result.html

投稿2021/07/16 00:07

odataiki

総合スコア973

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問