お気持ちのみですが、合計で150p程度の質問とさせていただきます。

ADO(?)でデータベースへ接続する際のコードについて教えて下さい。VBAで以下のコードを用いて
Cドライブに設置されたMySQLへ接続しました。これはうまく動作しました。

Const ConnectionString = "Driver={MySQL ODBC 3.51 DRIVER};" _
& " SERVER=localhost;" _
& " DATABASE=test_db;" _
& " USER=test_user;" _
& " PASSWORD=testpassword;"

Dim con As New ADODB.Connection
con.Open ConnectionString

ここで、XREAというサーバーに設置したデータベースに接続したいと思い、以下のコードに書き換えましたが、「[MysSQL][ODBC 3.51 Driver] Can't Connect to MySQL server on 's000@xrea.com'(10060)」という実行時エラーが出ます。

Const ConnectionString = "Driver={MySQL ODBC 3.51 DRIVER};" _
& " SERVER=s000@xrea.com;" _
& " DATABASE= databasekenuser;" _
& " USER=databasekenuser;" _
& " PASSWORD=testpassword;"

これを解消する方法を教えて下さい。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/02/10 00:51:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ttakao No.1

回答回数276ベストアンサー獲得回数31

ポイント150pt

ADOでもODBCでも接続用にTCP/IPポートを使います。よほど特殊なレンタルサーバー屋さんじゃない限り、主要なポート以外は閉じています。特にデータベースを触るポートを外部からアクセスされると、セキュリティとトラフィックの面からたまったもんじゃありません。

インターネット越しにデータベースを触るというのはやめておいたほうがいいと思います。

id:ReoReo7

回答ありがとうございます。初学者のため回答の意味が良く分からなかったので補足お願いします。

>ADOでもODBCでも接続用にTCP/IPポートを使います。

TCP/IPポートは通常、PC内での通信にのみ使われ、インターネットレンタルサーバーは外からのTCP/IPポートを用いたアクセスに対して閉じているということでしょうか?

>インターネット越しにデータベースを触るというのはやめておいたほうがいいと思います。

データベースとのやり取りは、

1:OCBDを用いてデータベースに事前登録データ(業務内容)を登録

2:オーダーメイドのアプリケーションソフトウェア(おそらく通信手段としてはODBCを利用)を用いて選択入力した業務内容を記録

の2種類があり、今回1:の通信手段を行いたいと思っています。

1:が無理だとしても、少なくとも2:の「アプリケーションからデータベースと通信」を行う必要があるのですが、その際にはどうやって接続を確保しているのでしょうか?

TCP/IPポートを利用できないということは、どのようにデータベースに書き込み/読み出しを確保したら良いのでしょうか?

2009/02/09 12:45:20
  • id:ReoReo7
    以下のページを参考に、

    http://www.mysql.gr.jp/mysqlml/mysql/msg/13742

    >・そのマシンから Linux へ ping が届く事を確認。

    を行ってみました(コマンドプロンプト上で ping **.**.***.***を実行)が、正常になReplyを得たようです。

    他の原因があるのでしょうか?

    尚、サーバーのデータベースへは、phpMyAdminを用いて接続はできており、
    現在のユーザーIDとパスワードはその接続の際に使ったものを用いております。

    他に何か調べる必要がありそうでしたらおっしゃってください。初心者なので少し戸惑っています。
  • id:Mook
    TCP/IP の中でそれぞれのサービスが利用するポートは規定されています。
    MySQL であればデフォルトで 3306ポートを使用しています。

    ttakao さんが回答しているように、ポートのほとんどは閉じられており
    プロバイダが外部に公開しているのは
    Web(80)、FTP(20,21)、メール:SMTP(25)/POP(110)、程度でしょう。
    http://www.vwnet.jp/mura/tcpip-port.htm
    (ping これとは別の概念で ICMP Echo が有効になていれば、応答が得られます。)

    ですから、外部からDBに直接アクセスするような方法はいかなる方法であっても
    使用できません。
    参考にされたページは同一のLAN内の話ではないでしょうか。

    PHPMyAdmin などは、Webポート(80)を使用して通信を行い、PHP⇒DBはサーバ内部の
    通信であるため、可能となっています。
  • id:ttakao
    Mookさんが補足してくれたとおりです。
    レンタルサーバー屋さんにおいてあるデータベースは、WEBを介したアプリケーションを作って処理するためのものです。大きな意味でいえば、phpMyAdminだってWEBを介したアプリケーションです。
    開発において、普通はxamppなどのパッケージを自分のPCに導入し、WEBサーバー、アプリケーション、データベースのセットでテストしてから、レンタルサーバー屋さんにデータ、プログラムをアップロード、設定して稼動させます。
    インターネットごしにODBC,ADOなどを使って直接SQLを処理することは、普通は許されていません。悪質な攻撃の格好の標的になりますし、遅くて使えないことでしょう。
  • id:ReoReo7
    Mookさん、ttakaoさん、ありがとうございます。
    とりあえずは明日できれば実現したいと考えていた「レンタルサーバーとの通信によるアプリケーションのクライアント機への導入」はあきらめ、次善策として用意していた「クライアント10台の側でルーターを介してサーバー機を別に設置し、そこへMySQLサーバーを設置」として対処したいと思います。

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

    また、サーバーが提供するポートのお話について、良く分かりました。
    確かに、参考にしていたページについては、同一LAN内での処理だったようです。

    今後は
    1:xamppを用いてWeb越しに動作するアプリケーションに作り変える
    または
    2:自前のサーバーを立て、Web越しのSQLコード命令も受け付けるようにする(これだと、大量のデータを送受信する際に遅すぎるということでしょうか。)
    にて対処したいと思います。
    さらに、
    3:レンタルサーバに、できる範囲の機能を移す
    も検討しています。

    上記1:はかなり時間を要するため、当面は2:にて対処したいと思います。
    3:についてももし実装できれば、2:までの繋ぎとして行いたいと考えております。

    ちなみに、データやり取りは、以下に示す
    4:業務内容のマスタデータ(varchar(20)×10フィールド×1000行×10テーブル程度)をサーバーから受信する(これをSQLiteに一時保存する)
    5:クライアントはSQLiteから読み込んで、業務内容のレコードを生成し、SQLiteに保存する。
    6:SQLiteにある業務内容のレコードをサーバーへ送信する
    の通りなので、クライアントの起動と終了以外にサーバーと通信を行う必要はありません。
    したがって、当面はサーバーと通信する機能のみWeb化できれば良いと考えております。

    そこで質問ですが、ppMyAdminなどのWEBアプリケーションは、クエリをサーバーへ送ることができるようですが、これはWEB越しならばサーバーに対してクエリを実行できるということでしょうか?

    ※尚、お二方のコメントされているような内容でしたら直接質問の答えにならなくても「コメント」ではなく「回答」して頂いて差し支えありません。どちらでも結構です。
  • id:ttakao
    えっと、Mookさんも私もこれ以上回答としたくないのは、失礼ながらご質問がWEBアプリケーションのイロハに近いことだからなのです。はてなの問答で済むような「ちょっとした質問」じゃないです。
    インターネット上には断片的な情報しかないです。基礎は本を購入されたほうがよいと思います。amazonでちょっと検索しました。

    -実践マスターPHP+MySQL
    -XAMPPではじめる全部無料のかんたん+

    などありますから、一冊購入して基礎を固めてください。急がば回れです。

    ちなみにSQLiteは相手がMySQLではなく、フラットファイルのはずです。MySQLを使ったほうがデータベースのメリットを享受できます。と、書くとまた、SQLiteとMySQLの機能の本質的な違いを聞きたくなると思います。基礎を固めないと、いつまでたっても質問ばかりすることになります。プログラムを動かすというのは総合力です。断片的な知識だけでできるものじゃないんです。
  • id:ReoReo7
    ありがとうございます。

    私がちゃんと学習したのは理系の数値解析に用いられるC言語プログラムだけで、VBA等は独学でPHPなどは全く知識が無かったので、その点について気になっておりました。以前した質問などのおかげでVBAだけはある程度最近プログラムできるようになってきたのですが、まだファイルの読み書きについては質問することが多いこの頃で、PHPやMySQLとなるとさっぱり、といった状況です。

    いろいろと初学者の私の質問に丁寧に答えて頂き、お手数をおかけしました。

    さて、本を2冊ご紹介頂きましたが、順序的に

    実践マスターPHP+MySQL

    が先だと思ったので、こちらを購入しました。また、本が届くまでは
    http://w1.nirai.ne.jp/freeze/index.html
    などのサイトで学習しようと考えています。

    どうもありがとうございます。今後ともよろしくお願い致します。
  • id:Mook
    WEB 越しというのがどのようなことをイメージされているかにもよりますが、一般には
    クライアントが送信したクエリを直接実行するのではなく、WEB アプリケーションが
    用意した画面上での機能をクライアントが操作し、その結果をウェブ画面の表示という形で
    受け取るのが、一般的なWEB アプリケーションです。

    そうでなければ、「DELETE FROM テーブル名」 や 「DROP DATABASE データベース名」を実行
    されるとどのようなことになるか容易に想像がつくでしょう。

    PHPMyAdmin はクエリを直接実行できるインタフェースを提供していますが、それはDB管理ツール
    という特殊なアプリケーションだからです。

    サーバがどのようなデータをクライアントと受け渡すかにもよりますが、ファイルを直接やり
    取りするのであれば、FTP などによるファイル受け渡しをを行うことも可能です。
  • id:Mook
    確かにこれらの技術を業務で使用するのには体系だった知識を習得するのに
    越したことはありませんが、ReoReo7 さんのようにまずは手を動かしてやってみよう
    というのは嫌いではありません。

    やってみてご自身に足りないものに気づかれたのであれば、それを習得していけば
    いいのですから。

    私もその昔、 DB も WEB もよくわからず、社内でのデータ処理システムを組みま
    した。今にしてみれば非常に稚拙なものでしたが、本やネットで調べて困難をひとつ
    ずつ解決したプロセスは技術を習得する大事な土台になりましたし、なにより完成した
    達成感はエンジニアとしての喜びでしょう。

    頑張ってください。
  • id:ReoReo7
    Mookさん

    ご回答ありがとうございました。以下、私が現在実現したいと考えている内容を書かせて頂きます。

    >WEB 越しというのがどのようなことをイメージされているかにもよりますが・・・

    基本的に、現在VBで作成され、クライアントで動作するアプリケーションとして実現されている全ての機能をWebに移したいと考えています。

    その内容としては、おっしゃるように「WEB アプリケーションが用意した画面上での機能をクライアントが操作し、その結果をウェブ画面の表示という形で受け取る」をイメージしています。(これに含まれる機能として、WEBアプリケーションが用意したフォームへ入力されたデータをデータベースに書き込むこと、などもあります。)

    いずれにしても、もし私がVBを使ってアプリケーションを改変・制作して所望の機能を実現したとしても、いずれは(将来計画として)これら全ての機能をWEBアプリケーションとして実現する必要があります。この作業は、外注するかもしれません。

    ※1 現在のアプリケーション(外注先にVB等で作って頂きましたが、使い勝手の問題や仕様の変更により、私が改変・制作を引き継いでおります)は、10台程度のクライアント・コンピュータへ試験的に導入され業務内容を計測するソフトウェアとして使用されておりますが、将来的には数千人がこのアプリケーションを利用する予定です。このため、クライアントへのインストールやルータを介したサーバー機の設置・通信の設定や、動作保障やアプリケーション機能のアップグレードなどの観点から、なるべくWEBで機能を実現したいと考えております。

    ※2 当面急ぎで必要なのは、計測したデータをサーバーへ蓄積する際に、そのサーバーをWEB上のもの(レンタルサーバーまたは自前サーバー)とすることです。この後※1を実現したいと考えています。※1の実現のイメージとしては、1~2年後です。


    >PHPMyAdmin はクエリを直接実行できるインタフェースを提供していますが、それはDB管理ツール
    という特殊なアプリケーションだからです。
    >サーバがどのようなデータをクライアントと受け渡すかにもよりますが、ファイルを直接やり
    取りするのであれば、FTP などによるファイル受け渡しをを行うことも可能です。

    ありがとうございます。
    (マスタデータの)受信はサーバーからのファイル受け渡しで構わないのですが、(業務内容のレコードデータの)送信はn台のクライアントコンピュータ(現在はn=10でも将来はn=1000)からのデータを全てまとめるテーブルが必要と思われるので、やはりデータベースに対してクエリを実行することが必要なのでは、と考えています。

    次善の策として、送信データはクライアント・アプリケーション起動時に前回のレコードをFTPでダウンロードしておいて、上書きしたデータをサーバーにアップロード(上書き)するという方法もあり得ると思います。ただ、その場合は(上書きによるデータ消失のリスクは何とかなるとして)レコードファイルをユーザーの数だけ用意するのが問題になると考えています。

    以上、アドバイスを参考に問題を自分なりに整理してみましたが、やはり自前サーバー(または外部からのODBCアクセスを許可する設定が可能な特殊なレンタルサーバー)を立てるのが良さそうに思えてきました。
  • id:Mook
    以下、雑感のみ。

    いろいろ試してみるのは良いことだと思いますが、運用のセキュリティに関してはご注意ください。
    特に業務に関するものに関し得t、インターネットの通常の通信にはセキュリティはないものとして
    考えるくらいのほうがよいと思います(実際そういう部分はあります)。
    それを回避するために VPN を使用したりセキュリティ通信(https等)を使用するわけです。

    やり取りするデータがどのようなものかわかりませんが、普通に第3者にわたっても問題なく、DB
    がハッキング等で破壊されても復旧が可能な体制でしたら、そのような構成もありかもしれません。

    1000人からの規模であれば、いろいろな点でレンラルサーバでの運用は難しいのではないでしょうか。
    これらを利用するのは社外の方が対象なのですか?
    通常の社内業務であれば、社内LANにサーバを建てるケースだと思いますが。利用が社外からであっても
    このケースであれば、自社サーバを立てたほうがよい気がします。

    詳細を把握していませんが、もし私がやるのであれば、次のようなモデルを考えるでしょうか。
    まず、社内 LAN が基本ですが、レンタルサーバを建てるなら少なくとも HTTPS 通信で実装します。
    サーバ側は、ユーザ要求に応じて処理データを CVS ファイルとして生成し、ダウンロードする形で
    提供します。
    ユーザは処理した結果を CSVファイルとしてでWEB APにアップロードすると、サーバが CSV を DB に
    登録し、結果を表示する。
    もちろんユーザ認証や処理履歴管理もします。

    けれどこの内容になると、ある程度 PHP や JAVA の知識がある人なら自作できますが、このWEB APの
    知識がないとやっぱり外注になりそうですね。
  • id:ReoReo7
    激励のお言葉ありがとうございました。元気が出ます。また、アドバイスをありがとうございました。

    データは、社外の人間も利用します。データはコード化(0001とか)し、読み替え表を手元に置くという形で対応する(流出に耐える)ことも不可能ではないように思います。ただ、ハッキングによる消失は、やはりまずいです。

    従って、アドバイスの通り、以下の機能を実装するのが良さそうに思います。

    1:社内に自社サーバを構築する
    2:HTTPS通信で実装する。
    3:サーバ側は、ユーザ要求に応じて処理データを CVS ファイルとして生成し、ダウンロードする形で提供する。ユーザは処理した結果を CSVファイルとしてWEB APにアップロードすると、サーバが CSV を DB に登録し、結果を表示する。

    セキュリティに注意しながら、頑張ってみようと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません