- PR -

AccessのSQLで条件付き連結した項目をDataSetで扱う問題

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-31 14:27
Access2000 の SQL で複数の項目を連結し、かつデータが無い場合の細工をするために replace を使ってみました。

コード:


SELECT 番号, replace((学年 & "-" & 組 & "-" & 出席番号), '--', '') AS 生徒番号
FROM 学校の人達 LEFT JOIN 今年の生徒 ON (学校の人達.番号 = 今年の生徒.番号);

学校の人達には、今年の生徒と学校の先生、OB・用務員さんが登録されています。
今年の生徒以外は、生徒番号欄に何も表示させたくないため、上記のようにしました。
これを「学校の人達番号と生徒番号」というクエリーとして登録しました。



VS2005で、DataSetに登録しようと、サーバーエクスプローラーの「関数」にある「学校の人達番号と生徒番号」から、DataSet.xsd に追加したところ、次のようなエラーがでました。

コード:


データオブジェクトのマージで次の問題が発生しました:
 1(Warning):ストアドプロシージャまたは関数に対するパラメーター
 情報を取得できませんでした。パラメーターコレクションは空になりま
 す。



Replace を外すとサーバーエクスプローラの「ビュー」に登録され、問題なく追加できたことから、1(Warning) は、Replace だろうと推測されます。

同じ結果が得られれば Replace を使うことには拘りません。
良い方法を御存知の方は、ご教示下さいますようお願いします。

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-07-31 14:27 ]
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-07-31 14:32
Access2000を使って無いから大外しの可能性があるけど、
>学年 & "-" & 組 & "-" & 出席番号
学年か、組か出席番号がNULLという事は無いですか?
(NULLに何をつけてもNULL)
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-31 14:41
引用:

冬寂さんの書き込み (2006-07-31 14:32) より:

学年か、組か出席番号がNULLという事は無いですか?
(NULLに何をつけてもNULL)


あります。
しかし、この場合の正しい表記の仕方が不明なのです。
Access上では普通に表示できたので、この SQL でアリだと勝手に思っておりましたが、駄目駄目なんでしょうか? orz
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-07-31 14:47
Access の クエリとして保存しておき、
.net からはそのクエリを SELECT するだけにするとか
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-31 16:23
引用:

かるあさんの書き込み (2006-07-31 14:47) より:

Access の クエリとして保存しておき、
.net からはそのクエリを SELECT するだけにするとか


なるほど!、と思ってやってみましたが同じ結果になりました。
こんな感じです。

コード:

「生徒さん達」
SELECT replace((学年 & "-" & 組 & "-" & 出席番号), '--', '') AS 生徒番号 
FROM 今年の生徒;

「学校の人達」
SELECT 学校の人達.番号 AS 番号, 生徒さん達.生徒番号 AS 生徒番号
FROM 学校の人達 LEFT JOIN 生徒さん達 ON (学校の人達.番号 = 生徒さん達.番号);


この二つのクエリーをAccess で登録して、VS2005 のサーバーエクスプローラーを最新の状態にした後に、DataSet.xsd に対してドラッグドロップしてみました。
しかし、全く同じエラーが表示されます。
Access側ではどちらも表示できています。

DataSet.xsd がコードを生成する時に何か起きているのでせうか・・・

#・・・更に、いろいろと調べてみます。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-07-31 16:38
こんにちは。

えーと、推測ですが。
replace は Access の内部関数なので、ADO.NET が replace を解釈
してくれていないのではないでしょうか。
(つまり Access に SQL を直接渡しているのではなく、ADO.NET が解釈
した後で Access に渡していると。ODBC みたいなイメージ?)

ADO.NET で使える関数と言うと今すぐは出てこないのですが、Iif とか
nz とかはどうでしょう。
(nz はムリかもしれません orz)

replace をその辺の関数に置き換えて一度試してみてください。

# いや、orz は関数じゃないです
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-31 16:57
引用:

ぽぴ王子様の書き込み (2006-07-31 16:38) より:
      ↑
改ざんしました。

ADO.NET で使える関数と言うと今すぐは出てこないのですが、Iif とか



なるほど、とても分かりやすい説明をありがとうございました。
上記の Iif を使って、次のようにしてみたところ無事DataSet.xsd に「学校の人達」を登録することに成功しました。

コード:

SELECT 番号, Iif(isnull(学年), '', (学年 & "-" & 組 & "-" & 出席番号)) AS 生徒番号
FROM 学校の人達 LEFT JOIN 今年の生徒 ON (学校の人達.番号 = 今年の生徒.番号);



ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)