ママのスキンケアのお悩みにおすすめアイテム

こんにちは。

現在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文を実行するという方法を考えているのですが、いろいろ検索しましたが探すことが出来ませんでした。

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

このQ&Aに関連する最新のQ&A

A 回答 (6件)

#3,4です。



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

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

この回答への補足

jamshid6様

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

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

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

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

補足日時:2010/01/29 10:34
    • good
    • 0

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



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

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

ShowMeHow様
jamshid6様

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

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

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

お礼日時:2010/01/29 12:25

#3です。



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

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

この回答への補足

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

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

補足日時:2010/01/29 09:21
    • good
    • 0

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



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

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

この回答への補足

具体的な話になりますが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
    • good
    • 0

SQLサーバーがあって、そこにいくつかテーブルがあり、


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

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

この回答への補足

>それとも何か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
    • good
    • 0

「リンクサーバー」って何だろう? 


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

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

この回答への補足

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

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

補足日時:2010/01/28 15:36
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテーブルの参照方法

よろしくお願いします。
SQLServer2005についての質問です。
(OS:Windows Server 2003 SP1)

サーバが2台あり、どちらにもSQL Server 2005 がインストールされ
ています。一方のサーバ(サーバA)に存在するテーブルを他方の
サーバ(サーバB)からTSQLで参照するにはどのようにすれば良い
でしょうか?

各サーバで必要な設定と、実行するTSQLのイメージを教えてください。

基本的なことかもしれませんが、調べてもさっぱり判らず困っています。
(sqlcmdを使うようだというところはなんとなく判りました)
どうぞよろしくお願い致します。

Aベストアンサー

リンクサーバを構築しないでもできますよ。
Management Studioから、リンク元のサーバを右Clickし、
サーバのプロパティを表示させます。
そこに、「接続」というタブがあるんで、
「このサーバへのリモート接続を許可する」をCheckONにしておく
ことと、

SQL Serverをインストールすると、
[構成ツール]の配下に「SQL Server セキュリティ構成」もインストールされるので、「サービスと接続のセキュリティ構成」を
選んで、SQL Server 2005 Surface Area Configuration を
起動させます。

[リモート接続]というタブがあるので
[ローカル接続および[リモート接続]を選択し、
適切なTCPプロトコルを設定し、適用させて、SQL Serverのサービスを
再起動すれば可能です。

細かい点としては、SQL Server Browser Serviceの有効化や
SQL Serverのファイアウォール設定を行う必要があります。

詳しいことは、ご確認頂いていたサイトの日本語版が
http://support.microsoft.com/kb/914277/ja-jp
にもありますので、少しはわかりやすいかと思います。

なお、設定後のSQLアクセスは、
select * from [サーバAのサーバ名].[DB名].[スキーマ名(dbo等)].[テーブル名]
で接続可能です。

よろしくお願いします。

参考URL:http://support.microsoft.com/kb/914277/ja-jp

リンクサーバを構築しないでもできますよ。
Management Studioから、リンク元のサーバを右Clickし、
サーバのプロパティを表示させます。
そこに、「接続」というタブがあるんで、
「このサーバへのリモート接続を許可する」をCheckONにしておく
ことと、

SQL Serverをインストールすると、
[構成ツール]の配下に「SQL Server セキュリティ構成」もインストールされるので、「サービスと接続のセキュリティ構成」を
選んで、SQL Server 2005 Surface Area Configuration を
起動させます。

[リモー...続きを読む

QSQL Server のキャラクターセット(内部文字コード)は何処で定義するのでしょうか?

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問させていただきます。
以下2点についてどなたかコメント願います。
1.(Oracleでいうキャラクターセット)はどこで定義するのでしょうか?
2.OracleでいうNLS_LANGに相当するものはあるのでしょうか?
 (ひょっとしたらマイクロソフト製品なのでサーバもクライアントもCP932固定なのでしょうか?)

根本的にはシステム構築する上で『極力文字化けに遭遇したくない』思い出このような質問をさせていただきました。
『文字化け』について注意点などありましたら合わせてコメントいただければ助かります。
以上よろしくお願いします。

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。
今回SQL Server2005 を使って簡単なシステムを構築する事になりました。
SQL Serverが扱う文字コートについて教えてください。
Oracleを使っていた時の経験としてDB内部のキャラクターセットと
クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。
きっとSQL Serverにおいても同じような事ではないかと思いここに質問...続きを読む

Aベストアンサー

Windowsのロケールの設定を日本語にした状態でSQLServerをインストールした場合、cp932がデフォルトの照合順序になります。照合順序については参考URLをご覧下さい。

SQLServerではわかりませんが、PostgresではJDBCドライバ部分で変換していたように記憶しています。ODBCドライバではAutoTranslateという機能があります。

このため、ODBC接続で何も考えずにvarcharを使用するとcp932になります。

参考URL:http://www.microsoft.com/japan/msdn/sqlserver/sql2005/bb330962.aspx

Qテーブル名を[]でくくらないとエラーになってしまう

テーブル名を[]でくくらないとエラーになってしまいます

sqlserver 2008 express edition を利用しているのですが

テーブル名 やカラム名に[]でくくってSQL文を実行しないと
エラーが出てしまいます
例えば

select * from [table]  の様にしないといけません
これを
select * from table で実行できるようにしたいのです
どうしたらいいのでしょうか

会社ではsqlserver2005を利用しているので
2008からは[]でくくる必要になったのでしょうか

それとも初期設定で何かしないといけないのでしょうか
設定方法を教えて下さい

sqlserver management studio2008もインストール済みです

Aベストアンサー

「table」はSQLの予約語です。そのため初期設定などで、「table」をそのままSQL文に使用することは出来ません。これは他のRDBも同様です。
SQL SERVERでは[]で括ることで、予約語をオブジェクト名に出来ますが、おすすめは出来ません。
なお、ANSI/ISOの標準規格では「"(ダブルクォーテーション)」で括ることで、同様にエラーを回避できます。SQL SERVERでも初期設定でANSI/ISOと同様に「"」で括るモードにすることは出来ますが、それでも予約語である以上何らかの対応は必要です。

> 会社ではsqlserver2005を利用しているので
> 2008からは[]でくくる必要になったのでしょうか

そんなことはないはずです。

Q2台のサーバー間でのテーブル結合方法

2台のサーバーでそれぞれSQL Server2000 とSQL Server2005を動かしています。
2台のサーバーの中の別のDBの中にあるテーブルを結合したいのですが、可能なのでしょうか?
ちなみに
[データベース名1]のサーバーに接続した状態で

SELECT a.*,b.* FROM [データベース名1].[dbo].[テーブル名1] AS a
INNER JOIN [ServerIPアドレス].[データベース名2].[dbo].[テーブル名2] AS b
ON a.ID=b.ID

とやると
「sys.serversにサーバー 'ServerIPアドレス' が見つかりませんでした。
正しいサーバー名を指定したかどうかを確認してください。
必要であればストアド プロシージャ sp_addlinkedserver を実行し、
サーバーを sys.servers に追加してください。」
というエラーになってします。
宜しくお願いします。

Aベストアンサー

「リンクサーバー」を設定します。
http://msdn2.microsoft.com/ja-jp/library/ms188279.aspx
設定すれば
SELECT a.*,b.* FROM [データベース名1].[dbo].[テーブル名1] AS a
INNER JOIN [リンクサーバー名].[データベース名2].[dbo].[テーブル名2] AS b
ON a.ID=b.ID
と書けます。

Q他のデータベースとのテーブル結合

いつもお世話になっております。
VB.netでwindowsアプリケーションの作成しているところです。
SQLサーバーのテーブルを参照していますが、テーブルの結合は同じデータベース内にないと結合できないのでしょうか?

'SQL接続処理
Dim strConn As String = "Password='';User ID=sa;Initial Catalog=test;Data Source=server1"

と、testというデータベースがありその中に幾つかテーブルがあります。
このtestデータベースにないテーブルが必要になり、aaaデータベース内の
テーブルを結合しようとしたのですが、出来ません。
Catalog=test,aaaとやってみたり、SELECT * FROM tbl1,aaa.tbl2などとしてみましたが、遠いようです。
SQLのクエリを使って、テーブルの追加をすると同じデータベース内のテーブルしか出てこないので、出来ないのかなと思っていますがどうでしょうか?

わかる方がいましたら教えてください。

いつもお世話になっております。
VB.netでwindowsアプリケーションの作成しているところです。
SQLサーバーのテーブルを参照していますが、テーブルの結合は同じデータベース内にないと結合できないのでしょうか?

'SQL接続処理
Dim strConn As String = "Password='';User ID=sa;Initial Catalog=test;Data Source=server1"

と、testというデータベースがありその中に幾つかテーブルがあります。
このtestデータベースにないテーブルが必要になり、aaaデータベース内の
テーブルを結合しよう...続きを読む

Aベストアンサー

select * from tbl1,[aaa].[dbo].[tbl2]
のように、[データベース名].[オーナー].[テーブル名]の様式で指定すれば、良いかと思います。
(当然、権限の問題がない前提ですが・・)

QEXISTSを使ったDELETE文

「SELECT文の件数」と、
「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。

【SELECT文】※2件返ってきます。
SELECT
  a.部署コード,
  a.社員コード
FROM
  社員マスタ a,
  組織マスタ b
WHERE
  a.部署コード = b.部署コード


【DELETE文】※50件 DELETEされます。
DELETE TABLE
  社員マスタ
WHERE
  EXISTS
  (
  SELECT
    a.部署コード,
    a.社員コード
  FROM
    社員マスタ a,
    組織マスタ b
  WHERE
    a.部署コード = b.部署コード
  )


環境はSQLSERVER2005です。
件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。

宜しくお願いします。

Aベストアンサー

EXISTS 句は、副問い合わせが行を返した場合 TRUE そうでない場合 FALSE と評価されます。

例示いただいた副問い合わせは TRUE を返すので DELETE されます。

詳細については、SQLの入門書を参考にしてください。

Q分散トランザクションを開始できなかった

[OSのVER]:2003server 同士
[SQLServerのVER]:SQLServer2000 StandardEdition SP3

はじめまして!
前のログ(http://www7.big.or.jp/~pinball/discus/sqls/26278.html)で
でていたエラーメッセージ

サーバー : メッセージ 7391、レベル 16、状態 1、プロシージャ
[Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。
[OLE/DB provider returned message: 指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。]
OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

と表示されます
ビューや、MSDTC(http://support.microsoft.com/?scid=kb;ja;329332&spid=2852&sid=global)
などすべてやってみましたがだめでした
Enterprise Managerでリンクサーバーを設定して中身を確認する事もできました
ビューでその別サーバーのDBを覗くこともできます

ストアドでカーソルを使用しています

DECLARE M_USER_CSR CURSOR FOR SELECT
INPDATE
FROM
[別サーバ名].DB.dbo.xxxxxx
WHERE
INPDATE = @COMP_DATE -- システム更新日付比較

と、定義して

FETCH NEXT FROM M_USER_CSR

としたところで、エラーが表示されます
最初のフェッチではエラーがでず(一件目は正常に内容を取得してます)
二件目のフェッチでエラーがでます

どのような解決方法がございますか?
どうか教えてください
よろしくお願いします


ps:サーバー同士はドメイン管理されていません
   ワークグループ管理のもと互いに信頼関係は結んでおります

[OSのVER]:2003server 同士
[SQLServerのVER]:SQLServer2000 StandardEdition SP3

はじめまして!
前のログ(http://www7.big.or.jp/~pinball/discus/sqls/26278.html)で
でていたエラーメッセージ

サーバー : メッセージ 7391、レベル 16、状態 1、プロシージャ
[Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。
[OLE/DB provider returned message: 指定されたトランザ...続きを読む

Aベストアンサー

もしかしたらですが、レジストリの
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\TurnOffRpcSecurity
は1になっていますか。
RPC (リモート プロシージャ コール) のセキュリティを無効にする必要があるかもしれません。

参考URL:http://support.microsoft.com/default.aspx?scid=kb;ja;827805

Q別のDBからテーブルをコピーする方法

SQL Server2005 Express Edition を使っています。
異なるDB間(同じコンピュータ内)で、テーブルをコピーしたいの
ですが・・・
コピー元DB名:DB_A
コピー元テーブル名:dbo.顧客
コピー先DB名:DB_B

テーブルのコピーは select * into ・・・ from ・・・ を使えばできそうですが、別DBの場合の方法がわかりません。
お教えいただければ幸いです。
よろしくお願いいたします。

Aベストアンサー

別のDBでも同じインスタンス内ならば同じです。

SELECT * INTO DB_B.dbo.顧客 FROM DB_A.dbo.顧客

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

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

Aベストアンサー

通常SQL Serverの権限はデータベース/ユーザ単位につけるもので、個別のテーブルに権限をつけることは極めて稀です。
また、SQL Serverにはテーブル単位で読み取り専用にする機能もありません。
実際に更新権限をはずしても、表示されるメッセージは異なります。
ということで、ずいぶん悩みましたが、可能性が1つありました。

そのテーブルには主キーがなく、しかも、主キーを指定しないままリンクしたのではありませんか?
主キーのないリンクテーブルは更新できません(ODBCドライバの仕様上)。
その点を確認してみていただけますか?

Q処理件数を非表示にしたい

ManagementStudioでストアドプロシージャの開発をしています

開発中、デバッグのためにプロシージャをコールすると、SQLの発行の度に
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
・・・

と処理件数が表示され、確認の際に邪魔で困っています。
処理件数を非表示にするにはどうすれば良いでしょうか?

また同様に、SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にできないでしょうか?

Aベストアンサー

処理件数を非表示にする方法

⇒SELECT文の前に「set nocount on」を記載すると件数は表示されません。

SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にする方法

⇒デバッグのためには表示された方が良いと思いますが、
 とりあえず…SELECT文の前に「SET NOEXEC ON」を記載するとデバッグだけ実施され、
 グリッドは表示されません。
例であげると以下のとおりです。
SET NOCOUNT ON
SET NOEXEC NO
SELECT *
FROM DB.dbo.TableName
go


人気Q&Aランキング