ADOでLAN内のDBにアクセスについて

解決


コーヒー飲みすぎ  2005-09-08 19:45:24  No: 92111

すみません、前に質問したものですが、ADO+SQL-SERVERで接続ができるということをお伺いしたのですが、
LAN(、といっても、NT-SERVERとかは入ってなく、ハブでパソコンをつないだだけなのですが)内のPCアプリケーションから同一LAN内のPCのデータベース(SQL-SERVER)に接続したいと思ったのですが、
ADOの接続の設定のところで、DBの存在が認識されません。

こういう場合、DBの存在を認識させる方法はありますでしょうか?おねがいします。


魔界の仮面弁士  2005-09-08 20:39:25  No: 92112

> ADOの接続の設定のところで、DBの存在が認識されません。
一覧に表示されないだけなら、セキュリティの都合上から、
あえてそういう設定にする事もあるので、あまり問題は無いような。

DB名を手動で入力しても接続できないのでしょうか?

以下、思いつくままに——。

LAN接続のプロトコルは、TCP/IPですか? あるいはNetBEUI?
LAN接続されたPC間の、(SQL Server以外での)接続確認は取れていますか?
サーバ側はWindows認証にしていますか? それとも混合認証?
http://www.sqlpassj.org/bunkakai/security/series/kihon/01.aspx
エラーメッセージが出るなら、その内容は何ですか?


コーヒー飲みすぎ  2005-09-08 20:55:02  No: 92113

魔界の仮面弁士さん、ご返答ありがとうございます。

>LAN接続のプロトコルは、TCP/IPですか? あるいはNetBEUI?
TCP/IP接続です。
>LAN接続されたPC間の、(SQL Server以外での)接続確認は取れていますか?
pingは通りました。それ以外はやってません
>サーバ側はWindows認証にしていますか? それとも混合認証?
SQL側でID/PASSWDを設定しました。Windows認証は使えませんでした。

>DB名を手動で入力しても接続できないのでしょうか?
>エラーメッセージが出るなら、その内容は何ですか?
手動で入力して接続のテストというボタンを押してみたのですが、プロバイダの初期化を失敗しました、というメッセージがでてしまいました。

よろしくおねがいします。m(__)m


コーヒー飲みすぎ  2005-09-08 20:57:46  No: 92114

連続かきこしていしまい、すみません。
リンクありがとうございます、参考になりそうなのでちょっとのぞいてみます


Geo=TK3  2005-09-08 22:23:39  No: 92115

前の質問て以下のスレッドですよね。

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080093.txt

で、使用している VB および SQL Server は以前と同じでいいのでしょうか?
あと

>手動で入力して接続のテストというボタンを押してみたのですが、プロバイダの初期化を失敗しました、と>いうメッセージがでてしまいました。

とありますが、ここで使用しているツールは何なのでしょう?
いや、単に私が「接続のテスト」というボタンを持っている ADO 関係のツールを
知らないので、何を使っているのかな、と (^^;; 。

また確認をお願いしたいのは以下の点。

(1) SQL Server が稼動している PC でパーソナルファイアウォールが
    稼動していないか
(2) SQL Server が稼動している PC 上では DB 接続が行えるか
(3) クライアント PC 側の MDAC バージョン。
    MDAC のバージョンは ComponentChecker というツールを使えば調べられます。
    Component Checker 自体は以下のサイトの下の方にあります。

    http://www.microsoft.com/japan/msdn/data/download.asp


魔界の仮面弁士  2005-09-08 23:10:47  No: 92116

> SQL側でID/PASSWDを設定しました。Windows認証は使えませんでした。
"使えない"という事は、
  「設定したいが、動作させる事ができない」
  「(クライアントOSの都合などで)今回の要件では採用できない」
のどちらの意味でしょうか?
……まぁ。それはともかく、SQL Server認証という事は了解しました。

>> LAN接続のプロトコルは、TCP/IPですか? あるいはNetBEUI?
> TCP/IP接続です。
では次に、SQL Server側の接続プロトコルは何ですか?

サーバ側のsvrnetcn.exeと、クライアントPC側のcliconfg.exeの設定が
一致しており、"TCP/IP"が最優先になっている事を確認してください。

あとは、ポート番号の設定も要チェック。実は、Firewallでブロック
されていた、なんて事も考えられますしね。

> 手動で入力して接続のテストというボタンを押してみたのですが、
これって、データリンクプロパティのボタンの事ですよね。

> プロバイダの初期化を失敗しました
接続後の認証失敗なら、「ユーザー'〜〜'のログインに 失敗しました。」
などのメッセージになりますが、そのメッセージだけだと、そもそも
DB接続前に失敗しているような雰囲気ですね。

一度、実際の『接続文字列』を見せてもらえますか?
特に、"Network Library", "Trusted_Connection", "Integrated Security"
あたりの有無が気になりますので……。


コーヒー飲みすぎ  2005-09-09 04:24:36  No: 92117

Geo=TK3さん
>(1) SQL Server が稼動している PC でパーソナルファイアウォールが
>    稼動していないか
ウイルス対策をはずして、DBの方のXPのファイアーウォールを無視するにしたら、出てくるエラーメッセージが変わりました。(加わりました。)

>(2) SQL Server が稼動している PC 上では DB 接続が行えるか
すみません、今確認中です。

>(3) クライアント PC 側の MDAC バージョン。
>    MDAC のバージョンは ComponentChecker というツールを使えば調べられます。
>    Component Checker 自体は以下のサイトの下の方にあります。
環境がローカルで読み込めるメディアがCD-ROMしかないので確認できません。貧相な環境ですみません  ^^;

魔界の仮面弁士さん
>"使えない"という事は、
>  「設定したいが、動作させる事ができない」
>  「(クライアントOSの都合などで)今回の要件では採用できない」
>のどちらの意味でしょうか?
Win-NT認証なるものが、よくわからなかったため、SQL-SERVER認証にしました。

>では次に、SQL Server側の接続プロトコルは何ですか?
TCP/IP接続です。

>サーバ側のsvrnetcn.exeと、クライアントPC側のcliconfg.exeの設定が
>一致しており、"TCP/IP"が最優先になっている事を確認してください。
すみません確認の仕方がわかりません。不勉強ですみません。

>あとは、ポート番号の設定も要チェック。実は、Firewallでブロック
>されていた、なんて事も考えられますしね。
netstatで調べてみたらsql-mssqlというのがESTABLISHとあってポート番号は1034です。

>これって、データリンクプロパティのボタンの事ですよね。
そうだと思います。

>一度、実際の『接続文字列』を見せてもらえますか?
接続文字列は"Provider=SQLOLEDB.1"と設定しました。

上にも書いたのですが、DB側のファイアーウォールをはずしたら、"プロバイダの初期化に失敗しました"に加えて、
・"ID:saのログインに失敗しました。"
・"SQL-SERVERの信頼関係の接続が関連付けられていませんというのが出ました。"

それで、DBのリモートサーバのIDの登録などしてみたのですが、メッセージは変わりませんでした。


もげ  2005-09-09 20:12:49  No: 92118

>接続文字列は"Provider=SQLOLEDB.1"

おそらく、これだけでは接続できないです。

SQL Server認証なら、
Provider=SQLOLEDB.1;Password=saのぱすわーど;Persist Security Info=True;User ID=sa;Initial Catalog=DB名;Data Source=DBサーバ名
とかですが、どこか記述が足りないか、もしくは指定を間違えてる可能性があります。
実際にはどのようにコードを書いていますかね?


魔界の仮面弁士  2005-09-09 20:18:06  No: 92119

私は普段、Jet や Oracle ばかり使っているので、MSDE / SQL Server は
あまり詳しくなかったりします……。一応、調べながら書いてはいるつもりですが、
もしも間違っていたら、誰かフォローお願いします。m(_ _)m

……というか、もはや VB に関する問題からは遠ざかっていますので、
VB系のコミュニティではなく、SQL Server系のコミュニティ(PASSJなど)に
移動された方が良いと思うのですが。(^_^;)

>>サーバ側のsvrnetcn.exeと、クライアントPC側のcliconfg.exeの設定が
>>一致しており、"TCP/IP"が最優先になっている事を確認してください。
> すみません確認の仕方がわかりません。不勉強ですみません。
それらは(コマンドラインではなく)ウィンドウベースの設定ツールなので、
実際に起動してみれば、使い方もすぐにわかるかと思いますよ。

サーバーPCでは、[スタート]-[ファイル名を指定して実行]から、
『svrnetcn.exe』を起動し、その内容をチェックします。
同様にクライアントPCでは、[スタート]-[ファイル名を指定して実行]から、
『cliconfg.exe』を起動し、その内容をチェックします。

で、それぞれに、『プロトコル』種類の選択や、TCP/IPポートの設定画面が
あるので、それらがサーバ/クライアント間で一致しているかを確認してください。

ちなみに、Net-Libraryの初期設定のポート番号は1433です。
http://www.microsoft.com/downloads/details.aspx?FamilyID=DD6BED8F-A706-48EE-95B7-BDC21455815A&displaylang=ja

> 接続文字列は"Provider=SQLOLEDB.1"と設定しました。
あれ? そんなに短くは無いですよね。
少なくとも、"Data Source"の指定ぐらいはあると思うのですが……。

とりあえず、主要なパラメータを紹介しておきますので、
余計な設定を含めていないか、または設定し忘れた項目が
無いかなど、もう一度確認してみてください。
# 特に、認証モード関係の設定は要チェック。

----------------
Provider
  Ole Dbプロバイダの指定です。SQL Server用プロバイダの場合は、
  "SQLOLEDB.1" です。単に "SQLOLEDB" と書いても OK。

Data Source (または Server)
  サーバー名の指定です。コンピュータ名やIPアドレスを指定します。
  自分自身に接続する際には、"(local)"という文字列も利用できます。
  なお、SQL Serverの名前付きインスタンスを指定している場合には、
  "server\instance"の形式で指定してください。

Initial Catalog (または Database)
  接続するデータベース名を指定します。特に指定しなかった場合には、
  SQL Server側で設定された規定のデータベースに対して接続されます。

User ID
Password
  文字通り、ユーザー名とパスワードの指定です。
  この設定は、SQL Server認証モードの際に使用されます。

Trusted_Connection
  ユーザー認証モードです。yesやtrueならWindows認証モードとなり、
  noやfalseなら混合認証モードとなります。下記の遷移図もご覧下さい。
  http://www.microsoft.com/japan/msdn/library/ja/adminsql/permdiag.gif

Integrated Security
  Windows認証モードにするなら、"SSPI" を指定します。それ以外は未指定に。
  ちなみにSSPIとは、「Security Support Provider Interface」の意味です。

Network Library
  使用するNet-LibraryのDLL名を指定します。パス、および拡張子(.DLL)は入れません。
  "dbmssocn" なら、Win32 Winsock TCP/IP です。今回はコレですね。
  "dbnmpntw" なら、Win32 名前付きパイプ です。
  "dbmsspxn" なら、Win32 SPX/IPX です。
  "dbmsvinn" なら、Win32 Banyan Vines です。
  "dbmsrpcn" なら、Win32 マルチプロトコル (Windows RPC) です。
  特に指定が無ければ、SQL Server クライアントの設定値が利用されます。
  この他には、Win16用の、"dbnmp3", "dbmssoc3", "dbmsspx3", "dbmsvin3",
  "dbmsrpc3"などといったDLLもありますが……今回は関係ないですね。
----------------

> ・"ID:saのログインに失敗しました。"
> ・"SQL-SERVERの信頼関係の接続が関連付けられていませんというのが出ました。"
「"」の対応がおかしいのはさておき、ここまで来たら、
データベースには到達したようですね。あとは認証の問題。

ついでなので、他のメッセージの場合も含めて列挙。

-------
(1) "ユーザー '○○' はログインできませんでした。"

SQL Server認証で接続したが、ユーザーのパスワードが
間違っていた場合です。パスワードが空になっていないか? 大文字小文字は
正しいか? そもそものユーザー名が正しいかなどを確認しましょう。

(2) "ユーザー '(null)' のログインに失敗しました。
    理由 : SQL Server の信頼関係接続に関連付けられていません。" 

"信頼関係接続(Trusted Connection)"は、Windows 認証接続を意味しています。
(null)というのは、認証が失敗して「不明なユーザー」で接続されている状態です。

(3) "ユーザー '○○' のログインに失敗しました。
    理由 : SQL Server の信頼関係接続に関連付けられていません。" 

上記(2)に似ていますが、こちらはユーザー名まで表示されています。
表示されているユーザー名(またはユーザーグループ名)が、期待している
Windowsユーザーであるか、そして、そのWindowsユーザーに対する
接続許可をSQL Serverに与えているかを確認してください。
なお、ドメインではなくワークグループの場合は、同一のワークグループに
所属しているかどうかもチェックしましょう。

(3) "SQL Server が存在しないか、アクセスが拒否されました。" 

SQL Server側のサービスが起動していない状態、または、SQL Serverの
サーバ名やインスタンス名を間違えて指定したような場合に発生します。
接続先の再確認を行いましょう。または、接続プロトコルの設定ミスも
考えられます。たとえば、先の(2)のエラーが出る時に、名前付きパイプ
(Network Library=dbnmpntw)で接続した時にも、同様のエラーになります。
----------------


コーヒー飲みすぎ  2005-09-11 22:57:36  No: 92120

魔界の仮面弁士さん、丁寧なご説明ありがとうございます。

>>>サーバ側のsvrnetcn.exeと、クライアントPC側のcliconfg.exeの設定が
>>>一致しており、"TCP/IP"が最優先になっている事を確認してください。
>> すみません確認の仕方がわかりません。不勉強ですみません。
>それらは(コマンドラインではなく)ウィンドウベースの設定ツールなので、
>実際に起動してみれば、使い方もすぐにわかるかと思いますよ。

起動できました。
設定で名前付きパイプが最優先になっていたため、TCP/IPを最優先にし、
再起動したあと、ユーザーsaでログインしましたら、ADODCの接続のテストは、無事うまくいきました。

それでコーディングを始めたのですが、

adoShouhinData ="Provider =SQLOLEDB.1; Persist Security Info = False; User Info =False; User ID =sa; Initial Catalog =db_order;Data Source=HANPEN"

adoShouhinData.Open
Set rsitem = New Recordset
rs.Open "SELECT * FROM db_order WHERE m_id=1",adoShouhinData,adOpenstatic,adOpenoptimistic"
・・・

としたのですが、レコードのOpenのところで、"オブジェクトが必要です。"というエラーが出てしまいました。
データ接続文字はADOデータコントロールでうまくいったものをコピーしただけなので、間違いはないと思います。(HANPENは私のDBサーバー名です。)


Geo=TK3  2005-09-12 11:08:30  No: 92121

内容が変わっているので別スレッド起こした方がいいと思います。

とりあえず気になるのは Recordset は rsitem なのに、Open してるのは
rs って辺りです。


魔界の仮面弁士  2005-09-12 19:40:49  No: 92122

質問内容に関しては、Geo=TK3さんに同意です。<別スレッド & 変数名 rs

いずれにしても、rs.Open時の「"」の対応がおかしいので、
> rs.Open "SELECT * FROM db_order WHERE m_id=1",adoShouhinData,adOpenstatic,adOpenoptimistic"
コードを見直す必要は、少なからずあるでしょうね。

それと、ADOで接続するときには、
  CursorLocation
  CursorType
  LockType
の3プロパティの意味について、きちんと把握しておいてくださいね。
(この3つのプロパティには、『使用可能な組み合わせ』が決まっています)
# SQLOLEDBでは、間違った組みわせを指定してもエラーにならず、自動的に
# 別の組み合わせに補正されてしまうので、間違いに気が付きにくいです。

> 設定で名前付きパイプが最優先になっていたため、TCP/IPを最優先にし、
> 再起動したあと、ユーザーsaでログインしましたら、ADODCの接続の
> テストは、無事うまくいきました。
接続文字列に、
 Network Library=dbmssocn;
を加えておくと良いかもしれません。こうすると、TCP/IPで接続に行きます。
# この設定が含まれていない場合は、cliconfg.exeの設定に依存します。

で。
いくら開発時だからとは言っても、常時saで接続するのは止めましょう。

最近は下火になったとはいえ、[Slammer]などに感染したら一大事ですので、
面倒でも、saには充分な長さの(推測されにくい)パスワードを付けておき、
かつ、VB等からの接続用に、テーブルの参照権限や更新権限のみを有する
ユーザーを作成する事をお奨めします。


コーヒー飲みすぎ  2005-09-14 04:12:18  No: 92123

魔界の仮面弁士さん、Geo=TK3 さん

上記のプログラムの問題点を修正し、簡単なDB利用プログラムを実行してみたらうまく動きました。
一般書に実装の仕方が載っていなかったため、かなり悩みましたが、おかげさまでADOを使用したイントラネットシステムを作ることができそうです。(かなりお世話になりました。m(__)m)
まだ私のわからない分野のこともこのページに載っていたので、保存して別の方法で接続するときの参考にしたいと思います、ありがとうございます。

>最近は下火になったとはいえ、[Slammer]などに感染したら一大事ですので、
>面倒でも、saには充分な長さの(推測されにくい)パスワードを付けておき、
>かつ、VB等からの接続用に、テーブルの参照権限や更新権限のみを有する
>ユーザーを作成する事をお奨めします。
Slammerは名前だけは聞いたことがあるのですが、万が一を考えてテスト用ユーザーを作成しておこうと思います。m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加