
C言語でMySQLを操作することを考えて勉強を始めたばかりなのですが、データベースのフィールドの数を表示するプログラムを作ったところ、エラーが出てしまいます。以下がコードです。
#include<windows.h>
#include<stdio.h>
#include<mysql.h>
int main(int argc, char **argv)
{
MYSQL *mysql;
MYSQL *con;
MYSQL_RES *result;
mysql = mysql_init(NULL);
if(NULL==mysql){
printf( "SQLの初期化に失敗しました.\n" );
exit(1);
}
const char *sever ="localhost";
const char *user = "root";
const char *password = "*******";
const char *database = "features";
unsigned int portnumber = 0;
unsigned int num_fields;
con = mysql_real_connect(mysql, sever, user, password, database, portnumber, NULL, 0);
if(NULL==con)
{
printf( "SQLのオープンに失敗しました.\n" );
exit(1);
}
result = mysql_store_result( mysql );
num_fields = mysql_num_fields( result );
printf("fieldの数は%dです。",num_fields);
mysql_close( mysql );
printf( "SQLをクローズしました.\n" );
return 0;
}
ビルドは正常終了するのですが、
これでF5を押すと、
mysql.exe の 0x5b8a8f04 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000048 を読み込み中にアクセス違反が発生しました
とエラーが、Ctrl+F5を押すと、
mysql.exe は動作を停止しました
と出る状態です。
試しにmysql.exeを直接起動してみるとやはり、エラーの画面が出ます。
MYSQL_RES *result;
unsigned int num_fields;
result = mysql_store_result( mysql );
num_fields = mysql_num_fields( result );
printf("fieldの数は%dです。",num_fields);
を消せば、正常に終了して、
SQLをクローズしました.
と出ます。
環境は、Windows 7 ultimate、OSは64bit
開発環境は、Microsoft Visual C++ 2010 Express
です。
MySQLはMicrosoft Visual C++ 2010 Expressで動くように32bit版を入れています。
どこが原因でエラーが起こっているのでしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
MySQL 5.5.25がインストールされてました。
# いくらか前に試しに入れた模様。
>接続先がポート0番でいいのでしょうか?
0でもよろしくやってくる…ようですな。
const char *sever ="localhost";
const char *user = "root";
const char *password = "********";
const char *database = "mysql";
unsigned int portnumber = 0;
unsigned int num_fields;
con = mysql_real_connect(mysql, sever, user, password, database, portnumber, NULL, 0);
if(NULL==con)
{
printf( "SQLのオープンに失敗しました.\n" );
exit(1);
}
mysql_query( mysql, "select host,password from user");
result = mysql_store_result( mysql );
if(NULL != result)
{
num_fields = mysql_num_fields( result );
printf("fieldの数は%dです。",num_fields);
}
else
{
int ErrorNo = 0;
char *error = NULL;
ErrorNo = mysql_errno(mysql);
error = (char*)mysql_error(mysql);
printf("errno = %u, error = %s\n", errno, error);
}
で、一応の出力はありました。
mysql_query()が未実行だとmysql_store_result()の戻り値はNULL、ErrorNoは0、errorは空文字になっていました。
# errnoという名前は、標準Cライブラリとカブるので変更。
# VC++2010EEではコンパイルエラーになりましたし…。
mysql_query()で第2引数が空文字だとmysql_store_result()の戻り値はNULL、ErrorNoは0、errorは"Query was empty"でした。
# mysql_query( mysql, ""); の時。
http://dev.mysql.com/doc//refman/5.1/ja/mysql-st …
>mysql_store_result()は結果セットが失敗した場合、ゼロポインターも戻します。mysql_error()が空でないストリングをを戻すか、mysql_errno()がゼロ以外を戻すか、mysql_field_count()がゼロを戻すかをチェックすることによって、エラーが起こったか否かをチェックすることができます。
とのコト。
クエリー発行していないのに結果を受け取ろうとする。
という、現状のコードが誤っているのかと。
>mysql.exe の 0x5b8a8f04 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000048 を読み込み中にアクセス違反が発生しました
はNULLポインタアクセスによるものでしょう。
>試しにmysql.exeを直接起動してみるとやはり、エラーの画面が出ます。
こっちは原因不明ですが。
# どう起動したのか、どんなコマンド投入したのか、表示されたエラーがなんだったのか…とか不明ですし。
返信が遅くなり申し訳ございません。mysql_query()の部分を入れると、mysql.exeの問題も起こらず、ちゃんとfield数が得られました。また、進めていけそうです。ありがとうございました!
No.2
- 回答日時:
LinuxかfreeBSDか……いずれにしろ非Windowsの例ですが。
http://www.kattch.com/~kattch/MySQL/06_3.html
その上で……
>unsigned int portnumber = 0;
>con = mysql_real_connect(mysql, sever, user, password, database, portnumber, NULL, 0);
接続先がポート0番でいいのでしょうか?
# MYSQL_PORT_DEFAULTで0にはなっているみたいですけど…。
mysql_store_result()の前にmysql_query()とか必要そうですが、そこら辺どうなんでしょう?
# というか掲示されたコードでmysql_store_result()の戻り値ってどうだったんでしょう?
# NULLだった場合にmysql_errno()でエラーコード取得する流れかと思いますが。
>試しにmysql.exeを直接起動してみるとやはり、エラーの画面が出ます。
データベースの設定がおかしいとか、そういったことはありませんか?
No.1
- 回答日時:
MySQLのバージョンも明記すべき…かと思いますが。
>MYSQL_RES *result;
>unsigned int num_fields;
>result = mysql_store_result( mysql );
>num_fields = mysql_num_fields( result );
>printf("fieldの数は%dです。",num_fields);
>を消せば、正常に終了して、
となると……
mysql_store_result()の戻り値はどんな感じなんでしょうかね?
と……。
http://www.mmdb.net/m_kaneko/mysql/kansu/mysql_s …
>戻り値
>結果の MYSQL_RES 結果構造体。エラーがある場合 NULL。
となっていますし。
# で、どうやってエラー情報取るんだろう?
# mysql_errno()…かな?
迅速な回答ありがとうございます。
int errno;
char *error;
errno = mysql_errno(mysql);
error = (char*)mysql_error(mysql);
printf("errno = %u, error = %s\n", errno, error);
を入れてみるなど、色々いじってみましたが、どうしてもmysql.exeがうまく動かず、どうにもなりません…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) mariadbでのエラー 1 2022/11/15 12:31
- MySQL mysqlがインストールされているのかわかりません 1 2023/06/05 02:26
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、P...
-
mysqlがインストールされている...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
テーブル名が可変の場合のクエ...
-
MySQL NULLだけをカウントして...
-
SQLで漢字名称を都道府県や市区...
-
エラー 1068 (42000): 複数の主...
-
何にかが違うから エラーなんで...
-
MySQLでcreateが使えない MySQL...
-
データベースの接続について
-
同一日に複数レコードがある場...
-
MAMP 99ドル約1.6万円 高い...
-
あってますか?SQL
-
WHERE `年月日` = '晴' OR `年...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysqlがインストールされている...
-
同一日に複数レコードがある場...
-
#1062 - '0' は索引 'PRIMARY' ...
-
エラー 1068 (42000): 複数の主...
-
SQLでカラムを追加し、条件に合...
-
テーブル名が可変の場合のクエ...
-
【初歩】ラジオボタンをつかっ...
-
MySQLのテーブル作成でハイフン...
-
mysqlのupdate構文についての質...
-
LIMIT で条件を満たしているの...
-
データベースの接続に失敗して...
-
MySQL NULLだけをカウントして...
-
select *, `人口(男)`AND`人口(...
-
複数DBテーブルからのデータ取得
-
テーブル:生徒名簿 生徒名簿の...
-
htmlコードで書かれた表にphpで...
-
データベースの複製の仕方(mysql)
-
「重複を間引いた数」をcountし...
-
MAMP 99ドル約1.6万円 高い...
-
SQLです教えてくださいお願いし...
おすすめ情報