プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願い致します。

VB2010とSQLServer2008でデータベースの勉強をしております。
DataAdapterを使用し、SelectCommand,UpdateCommandを設定、
それをDataGridViewに表示させています。

Column名とデータをSelectComanndの「AS」で変更した場合の
Update文の「CASE」の書き方?で混乱しております。


データベース Test1

No Sex
------
1 1
2 2
3 0


DataGridViewの表示

No 性別
-------
1 男
2 女
3 ?


データベース Test1をDataGridViewに表示
その際、「Sex」を1=男, 2=女, 0=?と表示させています
同時に、Column名を「性別」に変えました
SelectCommandでSQL文を以下のように設定しました


SELECT No, CASE Sex WHEN 1 THEN '男'
               WHEN 2 THEN '女'
               ELSE '?'
        END AS 性別
FROM Test1

これは希望通りに表示されました


UpdateCommandでSQL文を以下のように設定しました。

UPDATE Test3 SET Sex = CASE @sex WHEN '男' THEN 1
                        WHEN '女' THEN 2
                        ELSE 0
                END
WHERE No = @no

SQLDataAapter.UpdateCommand = New SqlCommand(SQL, myConnection)
SQLDataAapter.UpdateCommand.Parameters.Add("@sex", SqlDbType.Int, 32, "Sex")
SQLDataAapter.UpdateCommand.Parameters.Add("@no", SqlDbType.Int, 32, "No").SourceVersion = DataRowVersion.Original

UPDATE文でCASEが使えることは検索して分かったのですが、
Columnの表示を変えた場合はどうしたらよいのでしょうか?

なお、Select文、Update文ともに、「CASE」句を削除すれば正しく動作することは確認できました。

質問する場所を「データベース」と迷ったのですがこちらにしました。

ご指導のほど、よろしくお願い致します

A 回答 (3件)

実は手元に開発環境が無いから適当な回答なんだけど。

。。
普通に考えれば分かる範囲で、

┏━━データベース━━━┓┏━━━データソース━━━━━┓
                    文字列   文字列   数値
>UPDATE Test3 SET Sex = CASE @sex WHEN '男' THEN 1
 [データベースの Sex(数値)] ← [データソースの比較処理(文字列)で決めた値(数値)]

なんでしょ?あくまで @sex はローカルのデータソースのデータが入る
んだから、実際のテーブルのデータ型と一致する必要がないでしょう?
SQL の世界で言えばサブクエリのようなもの?関係ないでしょう?
"sex" とか使うから分かり難いのでは?完全に別物なんだから

UPDATE Test1 SET Sex = CASE @seibetu WHEN '男' THEN 1
                        WHEN '女' THEN 2
                        ELSE 0
                END
WHERE No = @suuti

くらいのほうが分かり易いのかも?
データベースが処理するのか、VB側で用意したデータの都合なのかを
そのまま考えれば、おのずと答えは出そうなもんだけど?

で、パラメータは、SQL の処理に使われるデータソースの話だから、
男、女のデータを入れて渡すんわけで、VB側のデータソースの設定として
普通に考えれば、
SQLDataAapter.UpdateCommand = New SqlCommand(SQL, myConnection)
SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NText , 32, "性別")
SQLDataAapter.UpdateCommand.Parameters.Add("@suuti", SqlDbType.Int, 32, "No")
とかでいいのでは?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご指摘頂きました文、
SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別")
を追加し、解決できました。

今までは1行ずつUPDATE文を発行していたので、大幅にコードを減らす事が出来ました。
ありがとうございました!

お礼日時:2011/12/19 13:20

1文字しか入らないのであれば、固定長でサイズ指定でいいのかな?


SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別")
この辺は調べてみて下さい。
    • good
    • 0

質問を読んでいると、データを男、女に変えたことの質問に聞こえる


んだけど、SqlParameter とデータテーブルの Column名 の結び付けの
質問ですか?CASE 文も実は関係ない話なのでは?
プログラムは1つ1つ単純作業の積み重ねなので、もっと切り分けて下さい。

・Column名を Sex のままで、データも 1, 2 のままで成功する事は確認済み。
> なお、Select文、Update文ともに、「CASE」句を削除すれば正しく動作する
> ことは確認できました。

・Column名を Sex のままで、データを 男, 女にして CASE 文の実行確認は?
↑成功すれば、CASE 文自体は問題ないので質問の内容から外せます。

・Column名 の結び付けの質問なら、データは単純なもので質問する。
テーブル名も Test1 で統一する。
データベース Test1
No Sex
------
1 1
2 2
3 0

DataGridViewの表示
No 性別
-------
1 1
2 2
3 0
検索時に Column名に別名をつけた場合、UpdateCommand でデータテーブルの列"性別"
と、実際のテーブルの列"Sex"を結びつける方法を教えて下さい。
SQL = "UPDATE Test1 SET Sex = @sex WHERE No = @no"
SQLDataAapter.UpdateCommand = New SqlCommand(SQL, myConnection)
SQLDataAapter.UpdateCommand.Parameters.Add("@sex", SqlDbType.Int, 32, "Sex")
SQLDataAapter.UpdateCommand.Parameters.Add("@no", SqlDbType.Int, 32, "No")
・・・とか?


で、
SQLDataAapter.UpdateCommand.Parameters.Add("@sex", SqlDbType.Int, 32, "Sex")
を書いている時点で気付いて欲しいんだけど、
http://msdn.microsoft.com/ja-jp/library/f38c3x2s …
第4引数:ソース列の名前を"性別"にすればいいのでは?
SQL 文はデータベースに丸投げされて、データベースが解釈しますから、別名を
付けられた情報など渡されてもどうにもできません。つまり、SQL 文上で"性別"の
指定は必要ないはずですよね?VB側の設定です。

この回答への補足

ご回答ありがとうございます!

> プログラムは1つ1つ単純作業の積み重ねなので、もっと切り分けて下さい。

おっしゃるお通りです。申し訳ありません…
ご指摘頂いた通り、私の質問はいくつもの問題を盛り込みすぎていました。

「SqlParameter とデータテーブルの Column名 の結び付けの問題」は解決できました。
SQL = "SELECT No, Sex AS 性別 FROM Test1 "

SQL = "UPDATE Test1 SET Sex = @sex WHERE No = @no "
SQLDataAapter.UpdateCommand = New SqlCommand(SQL, myConnection)
SQLDataAapter.UpdateCommand.Parameters.Add("@sex", SqlDbType.Int, 32, "性別")
SQLDataAapter.UpdateCommand.Parameters.Add("@no", SqlDbType.Int, 32, "No")
ご指摘頂きました通り、"Sex"→"性別"にすることで更新が出来ました。


> 質問を読んでいると、データを男、女に変えたことの質問に聞こえる
> んだけど、

一番お聞きしたいことはそこです!
データの表示を「男・女・?」に変えたときのUPDATE方法がわかりません。
データの表示をINT→文字に変えたのですから、UPDATEの際は文字→INTにしなければならない。
そこで、UPDATE文の中でCASEを使えばいいのでは?と勝手に思った次第です。

それをどこで処理すべきなのでしょうか?
ご指導のほど、よろしくお願い致します

補足日時:2011/12/19 11:28
    • good
    • 0

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