VCでのMYSQLへの接続方法

[戻る]
一年生 2006/03/16(木) 16:44:08
OSはXPで
Microsoft Platform SDK 
Visual C++ 2005 Express Edition
MYSQL
はインストール済みです。

VCとMYSQLを接続したいのですがコンパイルすらできていません。
ユニックス環境での接続はできていました。

ソースはネット載っているものを参考にしていますが、何をincludeすればいいのかも
エラーが出すぎてわからなくなっています。

接続が問題でさきに進めません。助けてください。
エラーのでたソースを見てください。

#include <windows.h>
#include <stdio.h>

// libmysql.libをリンク
// libmySQL.dllにパスを通す
// mysqlのヘッダをインクルードディレクトリに追加
#include <mysql.h>

// 発行するクエリ
#define SQLSTR "select * from xxx"
// 接続するホスト
#define HOST "xxxxx"
// ユーザ名
#define USR "xxxxxx"
// パスワード
#define PASS "xxxxxx"
// 使用するデータベース
#define DB "xxxx"

main()
{
    int i, rowcount;
    // MYSQLの定義
    MYSQL mysql;
    MYSQL* mysqldb = NULL;
    MYSQL_FIELD *fd;
    MYSQL_RES *resultset;
    MYSQL_ROW resultrow;

    // MYSQLに接続
    mysqldb = mysql_connect(&mysql, HOST, USR, PASS);
    if(!mysqldb)
    {
        MessageBox(NULL, "error" , "connect failed.", MB_OK);
        return;
    }

    // データベースを選択
    mysql_select_db(mysqldb, DB);

    // SQL文を発行
    mysql_query(mysqldb, SQLSTR);

    // 結果の取得
    resultset = mysql_store_result(mysqldb);
    // 行数の取得
    rowcount = mysql_num_rows(resultset);
    
    printf("-----フィールド名-----\n");
    // 全フィールド名の取得
    for(i = 0; fd = mysql_fetch_field(resultset); i++)
        printf("%d %s \n", i, fd->name);
    putchar('\n');

    printf("-----検索結果-----\n");
    for(i = 0; i < rowcount; i++)
    {
        // 検索結果のフェッチ
        resultrow = mysql_fetch_row(resultset);
        printf("%s %s \n", resultrow[0], resultrow[1]);
    }
    putchar('\n');

    mysql_free_result(resultset);
    mysql_close(mysqldb);
    getchar();
}

PATIO 2006/03/16(木) 16:53:14
日本MySQLユーザー会のホームページで調べてみましたか?
ざっと見たところ、こんなページがありましたけれど。

http://dev.mysql.com/doc/refman/4.1/ja/windows-client-compiling.html

あと、MySQLのヘッダーファイルってVCのコンパイラ通るんですかね。
使った事がないので良くわかりませんけれど。

あと参考にしたソースの出所なども書いておいた方がいいですよ。
解釈の間違いとか指摘してもらえるかもしれません。

一年生 2006/03/16(木) 17:15:43
早速のアドバイスありがとうございます!!

ソースは下記から参考にしました。
http://www.geocities.jp/monalipse/c/common/mysql.html

VCは(C自体はじめたばかりですが)初めてなのでわかりません・・。
日本MySQLユーザー会も見てみたんですが、あんまりよくわからず・・・。

MYSQLの接続はCであまりないのか、参考資料が少なくまた重要なポイントのみを載せて
いるので、素人からはその省いているところが知りたいと思っていました。

アドバイスの一文を入力してみました。

#include <windows.h>

#include <my_global.h>

#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i1, sw;
    char query[100] = "SELECT * FROM gakuseki";
    MYSQL *d_mysql = NULL;
    MYSQL_RES *result;
  ・
  ・
  ・


c:\documents and settings\my documents\visual studio 2005
\projects\sql\sql\sql3.c(29) : warning C4267: '関数' : 'size_t' から 'unsigned 
long' に変換しました。データが失われているかもしれません。
c:\documents and settings\my documents\visual studio 2005
\projects\sql\sql\sql3.c(44) : warning C4018: '<' : signed と unsigned の数値を
比較しようとしました。
c:\documents and settings\my documents\visual studio 2005
\projects\sql\sql\sql3.c(32) : warning C4700: 初期化されていないローカル変
数 'result' が使用されます
リンクしています...
sql3.obj : error LNK2005: _main は既に sql2.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'uuid.lib' を開くことができません。
プロジェクト : warning PRJ0018 : 以下の環境変数が見つかりませんでした:
$(\Program Files)
$(borland)
ビルドログは "file://c:\Documents and Settings\My Documents\Visual Studio 2005
\Projects\SQL\SQL\Debug\BuildLog.htm" に保存されました。
SQL - エラー 2、警告 3
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========


上記エラーがでました!
また助けてください!お願いいたします。

Blue 2006/03/16(木) 17:22:46
どちらかというと、リンクエラーですね。

sql3.cが自作ソースならば
warningはキャストしたり、使わない変数を消せば消えそうですね。

リンクエラーはパスがなんかおかしいのかも、、、

フォルダ構成と、どのようにパスの設定をしたのかを明記してみてはどうでしょうか?

一年生 2006/03/16(木) 17:37:44
すみません!!
エラー情報間違ってました。
見にくいと思いますがよろしくお願いいたします!


前回投稿ソースのエラーです。

warning C4013: 関数 'mysql_connect' は定義されていません。int 型の値を返す外部
関数と見なします。
warning C4047: '=' : 間接参照のレベルが 'MYSQL *' と 'int' で異なっています。
warning C4133: '関数' : 'char [6]' と 'LPCWSTR' の間で型に互換性がありません。
warning C4133: '関数' : 'char [16]' と 'LPCWSTR' の間で型に互換性がありません。
warning C4244: '=' : 'my_ulonglong' から 'int' への変換です。データが失われる可
能性があります。


http://www.sist.ac.jp/~suganuma/cpp/man/Java/DataBase.htm#C
を参考にしたソースも確認お願いいたします。

#include <windows.h>

#include <my_global.h>

#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i1, sw;
    char query[100] = "SELECT * FROM gakuseki";
    MYSQL *d_mysql = NULL;
    MYSQL_RES *result;
    MYSQL_ROW row;
                    // 初期設定と接続
                    // MYSQL *mysql_real_connect
(MYSQL *mysql, const char *host,
                    // const char *user, const char 
*passwd, const char *db,
                    // unsigned int port, const char 
*unix_socket,
                    // unsigned long client_flag) 
    d_mysql = mysql_init(d_mysql);
    d_mysql = mysql_real_connect
(d_mysql, "localhost", "xxxxx", "*****", "base", 0, NULL, 0);
    if (!d_mysql)
    {
        printf("***error***  接続に失敗しました\n");
        exit(1);
    }
                    // SQL 文の実行
    sw = mysql_real_query(d_mysql, query, strlen(query));
    if (sw != 0) {
        printf("***error***  SELECT 文の実行に失敗しました\n");
        mysql_free_result(result);   // 結果セットに割り当てたメモリ
を解放
        exit(1);
    }
                    // 正常にデータを取得したクエリ
(SELECT,SHOW,DESCRIBE,EXPLAIN)
                    // については,mysql_store_result
() または mysql_use_result() を
                    // 呼び出す必要がある
    result = mysql_store_result(d_mysql);
                    // 結果の表示
                    // mysql_fetch_row(result) : 結果
セットの次のレコードを取得します.
                    // mysql_store_result() を呼び出し
た後に mysql_fetch_row() を
                    // 使用する場合,取得するレコード
が残っていなければ NULL を返します.
    while (row = mysql_fetch_row(result)) {
        for (i1 = 0; i1 < mysql_num_fields(result); i1++)
            printf("%s ", row[i1]);
        printf("\n");
    }
                    // 接続を切る
    mysql_free_result(result);   // 結果セットに割り当てたメモリを解放
    mysql_close(d_mysql);

    return 0;
}

warning C4267: '関数' : 'size_t' から 'unsigned long' に変換しました。データが
失われているかもしれません。
warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
コードを生成中...
warning C4700: 初期化されていないローカル変数 'result' が使用されます
リンクしています...
error LNK2005: _main は既に sql2.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'uuid.lib' を開くことができません。
プロジェクト : warning PRJ0018 : 以下の環境変数が見つかりませんでした:
$(\Program Files)
$(borland)
ビルドログは "file://c:\Documents and Settings\My Documents\Visual Studio 2005
\Projects\SQL\SQL\Debug\BuildLog.htm" に保存されました。
SQL - エラー 2、警告 8
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

PATIO 2006/03/16(木) 17:39:05
ビルドエラーは一つずつ解決が原則だと思いますよ。
パッと見て原因が特定できるくらい慣れていれば、話は別ですけれど。

取り敢えずは警告を外すところからかかって見てはどうでしょう。
リンクエラーも良く見るとヒントになる部分があるみたいです。

_main は既に sql2.obj で定義されています。

って心当たりありませんか?

PATIO 2006/03/16(木) 17:42:19
あらら、ニアミス。

mysql_connectが見つからないと言っていますが、
綴りミスとかありませんか?

LPCWSTRの型が何なのか調べてみる事からやって見ては?

一年生 2006/03/16(木) 18:02:53
心当たりありました!
ありがとうございます。ひとつ解決!!

[uuid.lib]を開くため、VCのツールからライブラリファイルの設定をしてるんですがう
まくいきません。
この設定で、<mysql.h>や<windows.h>を開くことができたんですがここでとまってしま
って・・・。

$(\Program Files) → $(ProgramFiles) 
で2つ目解決!

と思ったら、

sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_close@4 が関数 _main で
参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_num_fields@4 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_fetch_row@4 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_store_result@4 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_free_result@4 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_real_query@12 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_real_connect@32 が関数 
_main で参照されました。
sql1_1.obj : error LNK2019: 未解決の外部シンボル _mysql_init@4 が関数 _main で
参照されました。
fatal error LNK1120: 外部参照 8 が未解決です。
プロジェクト : warning PRJ0018 : 以下の環境変数が見つかりませんでした:
$(borland)
ビルドログは "file://c:\Documents and Settings\My Documents\Visual Studio 2005
\Projects\SQL2\SQL2\Debug\BuildLog.htm" に保存されました。
SQL2 - エラー 9、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

こうなりました。
実はプロジェクトを新規でソースをコピーしたんです。
前回は何のつながりもないソースをちゃんと整理してなかった結果です。

一年生 2006/03/16(木) 19:47:44
リンクしているので、コンパイルできないのはライブラリの指定(?)をしてないから
かもしれないと思ったんですが、そのライブラリが検索してもありません。
MYSQLをインストールにミスがあったんでしょうか?
調べてはいるんですが、後からインストールできるんですか?
そんなファイルはあるんですか?

PATIO 2006/03/20(月) 14:52:20
日本MySQLユーザー会のホームページには、

libmysql.libまたは、mysqlclient.libをリンクするように書いてありますが、
そのファイルは見当たらないのでしょうか?
インストール時に特に選択肢が無かったのであれば、ライブリ関連も入って
いるのではないかと思うのですが。
インストール中に何か選択肢がありましたか?

一年生 2006/03/20(月) 16:35:47
[[解決]]
環境設定を全て自分でしたわけではなかったのでわかりませんが、

libmysql.lib

は見つかりました。
がVCのバージョンが違っていたらしく、コンパイルしなおして
プロジェクト→プロパティ→構成プロパティ→リンカ→コマンドライン
で追加のオプションに
/DEFAULTLIB:libmysql.lib
とし、ようやく進めました。

これは解決でいいのですか?
自分のPCを手に入れたときには正しくやり直したいと思います。

色々とありがとうございました。

PATIO 2006/03/22(水) 13:22:23
蛇足。

多分、追加オプションではなくて
プロジェクト→プロパティ→構成プロパティ→リンカ→入力で
追加の依存ファイルの所にlibmysql.libと入れてやっても大丈夫だったのでは
無いかと思います。.net 2003をみて書いているので多少表現が違うかもしれません。

古いスレッドには追加発言できません。