• ベストアンサー

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文を実行するという方法を考えているのですが、いろいろ検索しましたが探すことが出来ませんでした。 この様な方法がありましたら教えていただけないでしょうか?

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.5

#3,4です。 とりあえずはなによりです。 >この”master”というのがインスタンスという事でしょうか? これは違います。 先の接続文字列の例でいえば、「TestServer」がインスタンスです。 masterはシステムデータベースですが、別にmasterからでなくても、どのデータベースからでも通常はリンクサーバにはアクセスできるはずですよ。

itouke77
質問者

補足

jamshid6様 >先の接続文字列の例でいえば、「TestServer」がインスタンスです なるほど。 >別にmasterからでなくても、どのデータベースからでも通常はリンクサーバにはアクセスできるはずですよ。 本当ですね。確かにできました。 いろいろと勉強になりました。ありがとうございます。 あと実際にアプリを組んでみたところSQL文でデータを取り出すのに Accessに対して直接実行したのと時間が変わらない(遅い)気がしました。 この事から、リンクサーバーでのSQL文の実行自体はAccessで行っているのでしょうか?(Accessに負荷がかかっている?)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.6

>この事から、リンクサーバーでのSQL文の実行自体はAccessで行っているのでしょうか?(Accessに負荷がかかっている?) そりゃあそうです。 SQL Serverは質問者さんとAccessの間に立って、質問者さんの投げたSQL文をAccessに代わりに投げて結果を受け取っているだけですからね。 パフォーマンスを考えたら、別の人も書かれているようにACCESSの該当テーブルをSQL Serverへのリンクテーブルにして、SQL Serverからは実体のテーブルを参照するようにした方が遥かによいです。

itouke77
質問者

お礼

ShowMeHow様 jamshid6様 いろいろと勉強になりました。 Accessの方の知識がほとんどないので勉強してみます。 私のつたない質問にここまでお付き合いいただきありがとうございます。無事解決できました。 以上でクローズさせていただきたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

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

itouke77
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

今すでにリンクサーバの設定は存在するのですよね? たとえばAccessのリンクサーバが[ACC]であったとして、 エージェントタスクで SELECT * FROM [ACC]...Table1 を実行することと、同じものをC#のアプリケーションからSQL Serverに対して投げることとは どちらも実行がSQL Serverで行われるという意味では同じです。 なぜ同じようにC#から投げてはうまくいかないとお考えですか? (MDBが安定しない点はまあ置いとくとして)

itouke77
質問者

補足

具体的な話になりますが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 のようなコマンドが実行できると思うのですが、いろいろ調べましたがそこまでたどりつけていない状態です。

全文を見る
すると、全ての回答が全文表示されます。
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

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

itouke77
質問者

補足

>それとも何か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のテーブルにアクセスするように変える)する必要がありそうですね。

全文を見る
すると、全ての回答が全文表示されます。
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

「リンクサーバー」って何だろう?  もっと他にDBがあって、インターフェースのために使っているのかな?  「リンク」という言葉からは、リンクテーブルが想像されますが、どのDBのリンクテーブルがそこにあるのかがわかりません。  そのあたりの事情をもうすこし説明していただけたら、もう少し具体的な回答ができるかもしれません。 問題の解決としてはリアルタイムに更新を行うのが一番だと思いますが、 アクセスをDBとして使うこともできないわけではありません。 何がわからないのか判らないので、とりあえずコネクションの書き方。 http://www.connectionstrings.com/access-2007 アクセスは、時折、場合によっては頻繁に何かやばいことが起こるので、 複数クライアントから同時に使うことは(私は)あまりお勧めしません。

itouke77
質問者

補足

回答ありがとうございます。 言葉が足らなかった様で申し訳ありません。 リンクサーバーはSQL Serverの機能です。 mdbをSQL Server上で扱うために設定しました。 以前mdbの内容を定期的にSQL Serverに取り込む方法をここでうかがった時に教えていただきました。 確かにアクセスを都度確認いくような作りにすればリアルタイムに確認できるかもしれませんが、以前試して遅かったのとShowMeHowさんが 仰る様に、 >場合によっては頻繁に何かやばいことが起こる ような可能性がある為、避けております。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 現在リンクテーブルで繋いでいるテーブルをSQLサーバーへ移行しようと思うのですが

    現在リンクテーブルで繋いでいるテーブルをSQLサーバーへ移行しようと思うのですが 「SQLサーバーのテーブルを既存のアプリケーションにリンクさせる」 「新しいAccessクライアント/サーバ-アプリケーションを作成する」 のどちらがいいのでしょうか。 よろしくお願いします。

  • SQLサーバーとはリンクテーブルマネージャーのようなものですか?

    初めまして。こんにちは。 アクセスのファイル(mdb)が重いので どうすればいいのか他サイトでご相談したこところ、 「SQLサーバーに移行するのがいい」とのご回答をいただきました。 ただ、 SQLサーバーというもののメリットやイメージがいまひとつわかりません。 テーブルデータ以外はそのままMDBファイルに入れて、 テーブルのみを別ファイルに移行するリンクテーブル(be.mdb)と同じようなものなのでしょうか? よろしくお願いします。

  • SQLサーバーのテーブルに対してアクセスで更新クエリを行ないたい

    こんばんは。 ・vista ・アクセス2003 ・SQL Server 2005 です。 SQL ServerからテーブルをMDBへリンクしているのですが そのテーブルに対し、アクセス側で更新クエリを実行しようとすると 実行時エラー '3157': ODBC--リンク テーブル'テーブル名'での更新に失敗しました。 [Microsoft][ODBC SQL Server Driver]時間切れになりました。(#0) と言うエラーになり、更新クエリができません。 どうすればアクセスでSQLサーバーのテーブルに対して更新クエリを行えるのでしょうか? よろしくお願いします。

  • SQL ServerにOracleのリンクサーバー

    SQL Server 2000にOracle 11g R2のインスタンスをリンクサーバーとして追加したいです 以下の通りSQL Server 2000にOracle 11g R2のインスタンスをリンクサーバーとして追加することは 可能でしょうか。 <サーバー1> OS:Windows Server 2003 Standard Edition DBMS:SQL Server 2000 設定内容: (1)Oracle 11g R2のクライアントをインストール (2)サーバー2のインスタンスへのリンクサーバーを設定し、テーブルを参照(更新はしない) <サーバー2> OS:Windows Server 2008 R2 Standard Edition DBMS:Oracle 11g R2 設定内容:あるインスタンスにサーバー1が参照するためのテーブルを準備 また、さらに別のクライアントPCからMS Access 2010でサーバー1のリンクサーバーに対して パススルークエリを発行したりAccessにリンクテーブルを作成することは可能でしょうか。 SQL Server向けのSQL文が使えますでしょうか。

  • [AC2000]SQLで追加若しくは更新する考え方

    会社で店舗毎での勤怠管理のソフトの作成を指示されたのですが、 各店舗はVPN(GA)でネットワーク化されており、本社にファイルサーバーがあります。 しかし、会社のデータベースソフトはAccess2000しか無いので、本社のサーバーにデータ用のMDBを置き、各店舗には入力用のMDBを置き、本社では管理用のMDBを置こうと思います。 本題なのですが、リンクテーブルを使用すると当然重く、同時に各店舗から入力するのが困難なので、SQL(INSERT INTOとUPDATE)で制御しようとしたのですが、データがあったら更新、無ければ追加する、の様な条件制御をSQLで出来るのでしょうか? ADOでやれば出来るのですが、スキルアップの為悩んでいます。 考え方をご教授頂ければ、後は作成中のMDBに応用させて見たいと思いますので、宜しくお願いします。

  • SQLサーバーのテーブルの値が更新できません

    お尋ねします。 SQLサーバー2005にDB1というデータベースにdbo_TB1というテーブルがあります。そのテーブルの特定の列の値を更新したいので、AC.mdbというアクセスのファイルにテーブルのリンクをし、更新したいファイルを用意して、アクセスのクエリでデータを更新しようとしましたところ、更新ができませんでした。  dbo_TB1を更新可能にするためには、どのようにして権限を与えればいいでしょうか。  SQLサーバー2005の知識を習得しようと学習を始めたばかりで、よく理解できていません。よろしくお願いします。

  • SQL ServerにExcelをリンクさせたい

    AccessからSQL Server 2008 Expressへの移行を考えているの者です。 現在、Accessにいろいろな文字データ以外にExcelデータをリンクさせて使用しております。 (データ型はOLEオブジェクトのリンクを使っています) SQLServerでもAsseccのように他のアプリケーションやファイルをリンクさせることはできるのでしょうか? 可能であれば、どの様にすればよいのでしょうか? よろしくお願いします。

  • SQLサーバーはテーブルの置き場として使えるのでしょうか?

    SQLサーバー初心者です。 アクセスのMDBファイルのリンクテーブルとしてSQLサーバーを使う場合、 クエリとかストアドプロシージャー(?)などの機能があるみたいですが よくわからないので 本当にただテーブルの置き場としてSQLサーバーを使うことはできるのでしょうか? 宜しくお願い致します。

  • SQLサーバ、ADO、Accessなどなどの基本的な質問

    今回Webアプリケーション(データベース)をカスタマイズすることになり、 SQLサーバ、ADO、ASP、ODBC、CGI等々のキーワードが まわりで飛び交っているのですが、内容がまったくわからず、 参考書やヘルプで上記の言葉の意味を調べても、 どうもいまいちイメージが沸きません。 まったくの初心者にもわかりやすく、Webアプリのシステムイメージを 教えてもらえないでしょうか? わたしはAccessでしかデータベースを作成したことがない初心者です。 Webに関してもまったく無知なので。。 どなたかよろしくお願いいたします!

  • Access起動中にエクセルからADOでデータの更新ができない

    こんばんは。原因がわからないので質問させてください。 SQLサーバーのデータをAccessのmdbへリンクテーブルしています。 (SQLサーバー → Access) 全て一つのパソコンで行なっています。(LANには接続していません) Accessのmdbファイルを起動している時に ExcelからSQLサーバーのAccessにリンクしている上記のテーブルへ ADOを使ってデータを追加しています。 (Excel → Access)  しかし、「rs.Update」の部分で  「ODBC--リンク テーブル'テーブル1'での更新に失敗しました。」 となってしまいます。 なので、一度mdbファイルを落として、コードを再開すると通るので ADOでExcel → Accessにデータを追加し終わってから再度mdbファイルを立ち上げています。 また同じ状態(mdbファイルを起動)で Excel → SQLサーバー へ更新クエリをしようとすると「時間切れになりました」となります。 (こちらもmdbファイルを落とすと再開できます。) いちいちmdbファイルを落とすのめんどうなのですが 回避する方法はありますか? cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Users\Documents.test.mdb" rs.Open "テーブル", cn, adOpenStatic, adLockPessimistic rs("フィールド") = True rs.Update '保存 rs.Close: Set rs = Nothing というコードを書いています。 Accessを落とせば正常に動きます。 ご教授よろしくお願い致します。

このQ&Aのポイント
  • BCI-370/371を使用できるプリンターを探す方法について教えてください。
  • 大量に余ったBCI-370/371を使用できるプリンターを探しています。製造中止商品でも構いません。
  • キヤノン製品に関する質問ですが、BCI-370/371を使用できるプリンターの機種名を教えてください。
回答を見る