こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQL Serverのリンクサーバーの

こんにちは。

現在VisualStudio 2008 ProでC#を用いてWebアプリケーションを作成しようとしています。
いつもは、SQL Serverのデータを扱うのにADO.NETを使用してアプリケーションを作成しています。

Webアプリケーションのデータベース用のPCとしてWindows2003とSQL Server2005 Standardが搭載されているPCにAccess2003で作られているmdbがリンクサーバー設定されているものを用意しております。

このmdbは別のシステムで使用されており、常に更新されています。

今のところ、SQL Serverのタスクを用いて定期的(10分おきとか)にこのリンクサーバー上のmdbの情報を読み取り、SQL Server上に作ったテーブルを更新しているのですが、これだと情報を取りにいった時にタスクの更新が行われるまで、古い情報を取得することになります。

リアルタイムで取得することを考えた場合、
C#で作成したアプリケーションでこのSQL Serverにアクセスした時に直接リンクサーバーに対してSQL文を実行するという方法を考えているのですが、いろいろ検索しましたが探すことが出来ませんでした。

この様な方法がありましたら教えていただけないでしょうか?

投稿日時 - 2010-01-28 14:39:19

QNo.5630023

困ってます

質問者が選んだベストアンサー

#3,4です。

とりあえずはなによりです。
>この”master”というのがインスタンスという事でしょうか?
これは違います。

先の接続文字列の例でいえば、「TestServer」がインスタンスです。
masterはシステムデータベースですが、別にmasterからでなくても、どのデータベースからでも通常はリンクサーバにはアクセスできるはずですよ。

投稿日時 - 2010-01-29 09:54:00

補足

jamshid6様

>先の接続文字列の例でいえば、「TestServer」がインスタンスです
なるほど。

>別にmasterからでなくても、どのデータベースからでも通常はリンクサーバにはアクセスできるはずですよ。

本当ですね。確かにできました。
いろいろと勉強になりました。ありがとうございます。

あと実際にアプリを組んでみたところSQL文でデータを取り出すのに
Accessに対して直接実行したのと時間が変わらない(遅い)気がしました。
この事から、リンクサーバーでのSQL文の実行自体はAccessで行っているのでしょうか?(Accessに負荷がかかっている?)

投稿日時 - 2010-01-29 10:34:15

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>この事から、リンクサーバーでのSQL文の実行自体はAccessで行っているのでしょうか?(Accessに負荷がかかっている?)

そりゃあそうです。
SQL Serverは質問者さんとAccessの間に立って、質問者さんの投げたSQL文をAccessに代わりに投げて結果を受け取っているだけですからね。

パフォーマンスを考えたら、別の人も書かれているようにACCESSの該当テーブルをSQL Serverへのリンクテーブルにして、SQL Serverからは実体のテーブルを参照するようにした方が遥かによいです。

投稿日時 - 2010-01-29 11:27:52

お礼

ShowMeHow様
jamshid6様

いろいろと勉強になりました。
Accessの方の知識がほとんどないので勉強してみます。

私のつたない質問にここまでお付き合いいただきありがとうございます。無事解決できました。

以上でクローズさせていただきたいと思います。

投稿日時 - 2010-01-29 12:25:56

ANo.4

#3です。

リンクサーバはSQL Serverに設定するものです。
ですから、今アクセスしているSQL Serverのインスタンスにリンクサーバを設定されているのであれば、そのインスタンスに対してSQL文を投げないといけません。
SELECT * FROM [ACC]...Table1
の「ACC」が何かは設定されたSQL Serverにしかわからないことです。

つまり、今接続しているデータベースに対して
SELECT * FROM [ACC]...Table1
を投げればいいということです。

投稿日時 - 2010-01-29 02:55:48

補足

SQL Server Management上でSQL文”SELECT * FROM [ACC]...Table1”
を実行した時に、データベース名が”master"になっていたので
試しに簡単な動作確認アプリを作り、接続文字列のInitial Catalogに”master”を指定してみたところ、うまくデータを取得することができました。

この”master”というのがインスタンスという事でしょうか?

投稿日時 - 2010-01-29 09:21:55

ANo.3

今すでにリンクサーバの設定は存在するのですよね?

たとえばAccessのリンクサーバが[ACC]であったとして、
エージェントタスクで
SELECT * FROM [ACC]...Table1
を実行することと、同じものをC#のアプリケーションからSQL Serverに対して投げることとは
どちらも実行がSQL Serverで行われるという意味では同じです。

なぜ同じようにC#から投げてはうまくいかないとお考えですか?
(MDBが安定しない点はまあ置いとくとして)

投稿日時 - 2010-01-28 19:06:24

補足

具体的な話になりますがC#でSQL Server上に設定したリンクサーバへのアクセス方法(どのようなコードを書けばよいか)がわからない状態です。

SQL Serverに通常作成したデータベースに対してのADO.NETでのアクセスは把握しております。
Visual Studioでサーバエクスプローラーで接続の追加をすれば

Data Source=TestServer;Initial Catalog=Northwind;Integrated Security=True

のように接続文字列がわかりここからConnectionしSQL文の実行を行うようなプログラムを作成できます。

しかしリンクサーバーのデータベースに対しては、同様のやり方で試してもVisual Studioのサーバエクスプローラーでは現れずどのように追加すればよいかわからない状態です。

接続さえできれば
>SELECT * FROM [ACC]...Table1
のようなコマンドが実行できると思うのですが、いろいろ調べましたがそこまでたどりつけていない状態です。

投稿日時 - 2010-01-29 01:39:18

ANo.2

SQLサーバーがあって、そこにいくつかテーブルがあり、
別にMDBがあって、SQLサーバーのリンクテーブルがある。
さらに、そのMDBには別途データ格納要のテーブル等が用意されていて、
通常のトランズアクションはMDBに対して行われている。
そして、10分に一回程度MDBのデータを元にSQLサーバーのデータを更新している。
しかし、(Web)情報の閲覧はSQLサーバーから行われているので、最新の情報は閲覧できない。
ということでしょうか?

だとすると、通常のトランズアクションをSQLサーバーに対して行うのが筋だと思います。 
それとも何かMDBが必要な理由があるのでしょうか?

投稿日時 - 2010-01-28 18:02:17

補足

>それとも何かMDBが必要な理由があるのでしょうか?

MDBは既に別のシステムA(Accessで作成)で利用されていて、自分が作成したシステムBでこのMDBのうちのひとつのテーブルを利用する必要が出てきたからです。
しかしMDBのテーブルからADO.NETでデータを取り出すときに遅かったので、先述した用にSQL Server上でこのテーブルをSQL Serverのいタスクで定期的(10分)に更新して利用しています。ですがこの方法だと10分間隔のデータしか取得できません。システムAによってリアルタイムに更新されたテーブルをなんとか取り出せないかと思い今回質問させていただいた次第です。

>通常のトランズアクションをSQLサーバーに対して行うのが筋だと思います。

なるべくシステムA(別の担当者が作成したので)には触れたくないと考えていたのですが、確かにMDBのテーブルをSQL Serverに移し変えての運用(Access側のプログラムを変更し、MDBのテーブルからSQL Serverのテーブルにアクセスするように変える)する必要がありそうですね。

投稿日時 - 2010-01-29 01:17:20

ANo.1

「リンクサーバー」って何だろう? 
もっと他にDBがあって、インターフェースのために使っているのかな? 
「リンク」という言葉からは、リンクテーブルが想像されますが、どのDBのリンクテーブルがそこにあるのかがわかりません。 
そのあたりの事情をもうすこし説明していただけたら、もう少し具体的な回答ができるかもしれません。

問題の解決としてはリアルタイムに更新を行うのが一番だと思いますが、
アクセスをDBとして使うこともできないわけではありません。
何がわからないのか判らないので、とりあえずコネクションの書き方。
http://www.connectionstrings.com/access-2007
アクセスは、時折、場合によっては頻繁に何かやばいことが起こるので、
複数クライアントから同時に使うことは(私は)あまりお勧めしません。

投稿日時 - 2010-01-28 14:57:48

補足

回答ありがとうございます。
言葉が足らなかった様で申し訳ありません。
リンクサーバーはSQL Serverの機能です。
mdbをSQL Server上で扱うために設定しました。
以前mdbの内容を定期的にSQL Serverに取り込む方法をここでうかがった時に教えていただきました。

確かにアクセスを都度確認いくような作りにすればリアルタイムに確認できるかもしれませんが、以前試して遅かったのとShowMeHowさんが
仰る様に、
>場合によっては頻繁に何かやばいことが起こる
ような可能性がある為、避けております。

投稿日時 - 2010-01-28 15:36:04

あなたにオススメの質問