[Windowsシステム運用]
InfoPath−SQL Server連携で構築するC/Sシステム

第3回 データ接続におけるSQL文を編集する

3.InfoPathのデータ接続にDELETE文を記述する

兵庫県立西宮香風高等学校システム管理課長
Microsoft MVP for InfoPath
松本 吉生
2007/05/24

 InfoPathのデータ接続はSQL文を書くことができるということが分かったが、SELECT文以外のSQL文を書くことができるだろうか。例えばDELETE文をデータ接続に書くと、そのままではInfoPathがエラーメッセージを出し、データ接続を構成することができない。しかし、ある工夫をすることでDELETE文もデータ接続に書いて実行することができる。ここではInfoPathのデータ接続にDELETE文を書いて実行する手順を説明するが、このDELETE文のテストでは、実際に実行してしまったときに大切なデータを失わないように、データ接続先を間違えたり、SQL文を書き間違えないように慎重に行ってほしい。

 先に作ったInfoPathのフォームを利用し、メニューバーから「ツール」−「データ接続」をクリックし、新しいデータソースを作る。「データ接続」のウィンドウには、先に作った「メイン接続」があるはずだ。新しくデータ接続を作成するために、[追加]ボタンをクリックする。

データ接続の追加
「データ接続」ウィンドウでデータ接続を追加する。
  すでに作成した「メイン接続」がある。
  [追加]ボタンをクリックして新しいデータ接続を作成する。

 次のウィンドウでは、追加するデータ接続が「データの送信」か「データの受信」かを選ぶ。直感的にはDELETE文をSQL Serverに投げるので「データの送信」のように思うが、「データの送信」ではSQL Serverに接続できない。ここで作成するSQL文は、あくまでもSQL Serverに対するクエリ=問い合わせであるので、「データの受信」を選択する。その次のウィンドウでは、データの受信元として「データベース(Microsoft SQL ServerまたはMicrosoft Office Accessのみ)」を指定する。

データ接続の使用
データ接続の使用を選択する。
  「データの受信」ラジオボタンをクリックして選択する。
  [次へ]ボタンをクリックしてウィザードを進める。
  「データベース(Microsoft SQL ServerまたはMicrosoft Office Accessのみ)」を選択する。
  これをクリックする。

 データ接続ウィザードの次の画面では、[データベースの選択]ボタンをクリックする。すると先に作成したメイン・データソースのデータファイルができているので、それを選択して[開く]ボタンをクリックする。メイン・データソースのテーブル構造が表示されるので[SQLの編集]ボタンをクリックする。

データベースの設定
データベースを設定する。
  [データベースの選択]ボタンをクリックする。
  すでにできているメイン・データソースのファイルを選択する。
  これをクリックして開く。
  これをクリックして編集する。

 データソースにはメイン・データソースのSQL文が生成されているので、このSQL文を、次のように変更する。このSQL文は、「商品管理」テーブルのデータをすべて削除するSQL文である。

delete from 商品管理

 変更したら[SQLステートメントのテスト]ボタンをクリックする。すると「テストに失敗しました。」というエラー・メッセージが出るので、[詳細の表示]ボタンをクリックしてエラーの詳細を見る。すると「ADO アダプタはスキーマを取得できませんでした。指定されたクエリで返されるレコードセットはありません。SQL ステートメントを確認してください。」というメッセージが表示される。

DELETE文の入力
SQLの編集でDELETE文を記述する。
  ウィザードで自動的に生成されたSQL文。
  SQL文を「delete from 商品管理」と書き換える。
  [SQLステートメントのテスト]ボタンをクリックしてSQL文を確認する。
  「指定されたSQLステートメントは有効なクエリではありません。」とメッセージが表示される。
  [詳細の表示]ボタンをクリックしてエラーの詳細を確認する。
  「ADO アダプタはスキーマを取得できませんでした。指定されたクエリで返されるレコードセットはありません。SQL ステートメントを確認してください。」というメッセージが表示される。

 なぜこのようなエラーが出るかといえば、InfoPathのデータ接続はデータを得るためのものであるが、ここで変更したSQL文は何もデータを取得しないため、返されるレコードセットがないのでエラーと判断されたのである。そこで、ダミーのSELECT文を付け加えて、次のようなSQL文にする。

select 'dummy'
delete from 商品管理

赤字は付け加えたSQL文

 ここで「select 'dummy'」の文は、「dummy」という固定の文字列を取得するダミーのSELECT文である。そして[SQLステートメントのテスト]ボタンをクリックしてSQL文を確かめる。すると「テストに失敗しました。」とのダイアログボックスが表示されるので、[詳細の表示]ボタンをクリックする。エラーの詳細には「複数のレコードセットはサポートされていません。」と書かれている。

SQLの編集でダミーのSELECT文を付け加える
  SQL文に「SELECT 'dummy'」文を付け加える。
  [SQLステートメントのテスト]ボタンをクリックしてSQL文をチェックする。
  「テストに失敗しました。」とのダイアログボックスが出るので、[詳細の表示]ボタンをクリックしてエラーの詳細を見る。
  「複数のレコードセットはサポートされていません。」というエラーが確認できる。

 ダミーのSELECT文によって、1件のレコードセットしか返されないはずなのに、複数のレコードセットが返されたというエラーの理由は、SQL Serverの処理の仕方にある。SQL Serverはステートメントによる処理が終わったとき、「X行処理されました」という、処理行数の結果をクライアントに返すようになっている。この処理行数の結果を、ダミーのSELECT文の結果と合わせて「複数のレコードセットが返ってきた」とInfoPathが勘違いしているのである。

SET NOCOUNT ONで処理行数の結果を返さないようにする

 このような現象はSQL Serverのストアド・プロシージャでは既知の事実であり、処理行数の結果を返さないようにするための方法として、「SET NOCOUNT ON」がある。これを使って、再度SQLの編集で、SQL文を次のように変更し、[SQLステートメントのテスト]を行ってみよう。

set nocount on
select 'dummy'
delete from 商品管理

赤字は付け加えたSQL文

SET NOCOUNT ONの追加
SQLの編集で「SET NOCOUNT ON」の文を付け加える。
  SQL文に「SET NOCOUNT ON」の文を付け加える。
  [SQLステートメントのテスト]ボタンをクリックしてSQL文をチェックする。
  「テストに成功しました。」とのダイアログボックスが出る。

 テストに成功したら、[OK]ボタンをクリックして「SQLの編集」ウィンドウに戻り、[OK]をクリックする。ここで「入力されたSQLステートメントはツリービューで表示できません。続行しますか?」のダイアログボックスが出るが、[はい]をクリックしてよい。さらにデータ接続ウィザードを[次へ]ボタンをクリックして次へ進めようとすると、「安全であるかどうかを判断できません。」というメッセージが出る。これも[はい]をクリックして構わない。

編集完了時のメッセージ
SQLの編集を完了する際には、このようなメッセージが表示される。
  SQLの編集を完了するときに表示されるメッセージでは[はい]をクリックして次へ進む。
  データ接続ウィザードを次へ進めるときに表示されるメッセージでも、[はい]をクリックして次へ進む。

 データ接続ウィザードの最後の段階で、データ接続の名前を決める。ここでは「データの全削除」といったような、分かりやすい名前を付けておこう。もう1つ重要なことは、「フォームを開くとき自動的にデータを取得する」のチェック・ボックスを外しておくことである。このチェック・ボックスはデフォルトでチェックされているが、これをチェックしたままにしておくと、フォームを開いたときに自動的にクエリが送信されて、すべてのデータが削除されてしまう。そして最後は[完了]ボタンをクリックしてウィザードを終了する。ウィザードを終了すると、データ接続に「データの全削除」というデータ接続ができていることが確認できる。

ウィザードの完了
データ接続ウィザードの最後に、データ接続の名前を入力する。
  「データの全削除」と入力する。
  「フォームを開くとき自動的にデータを取得する」のチェック・ボックスを外す。
  [完了]ボタンをクリックしてウィザードを終了する。
  「データの全削除」データ接続ができている。
  これをクリックする。

 今回は、データ接続の設定を編集して、任意のSQL文を記述する方法について説明した。またDELETE文のような、結果のセットを返さないSQL文(SELECT文以外のSQL文など)を実行させる方法についても解説した。次回は、こうやって作成したSQL文をInfoPathから呼び出して実行する方法や、呼び出しのためのボタンを作成する方法などについて解説する。End of Article


 INDEX
  [Windowsシステム運用]InfoPath−SQL Server連携で構築するC/Sシステム
  第3回 データ接続におけるSQL文を編集する
    1.InfoPathのデータ接続にSELECT文を記述する
    2.InfoPathのデータ接続にサブクエリを記述する
  3.InfoPathのデータ接続にDELETE文を記述する
 
 運用


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間