dポイントプレゼントキャンペーン実施中!

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版を入れています。
どこが原因でエラーが起こっているのでしょうか?
よろしくお願いします。

A 回答 (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を直接起動してみるとやはり、エラーの画面が出ます。

こっちは原因不明ですが。
# どう起動したのか、どんなコマンド投入したのか、表示されたエラーがなんだったのか…とか不明ですし。
    • good
    • 0
この回答へのお礼

返信が遅くなり申し訳ございません。mysql_query()の部分を入れると、mysql.exeの問題も起こらず、ちゃんとfield数が得られました。また、進めていけそうです。ありがとうございました!

お礼日時:2012/08/07 14:47

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を直接起動してみるとやはり、エラーの画面が出ます。

データベースの設定がおかしいとか、そういったことはありませんか?
    • good
    • 0

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()…かな?

この回答への補足

すいません、MySQLのバージョンは5.5です。

補足日時:2012/08/04 00:45
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございます。
int errno;
char *error;
errno = mysql_errno(mysql);
error = (char*)mysql_error(mysql);
printf("errno = %u, error = %s\n", errno, error);
を入れてみるなど、色々いじってみましたが、どうしてもmysql.exeがうまく動かず、どうにもなりません…

お礼日時:2012/08/04 02:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!