よろしくお願い致します。
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」句を削除すれば正しく動作することは確認できました。
質問する場所を「データベース」と迷ったのですがこちらにしました。
ご指導のほど、よろしくお願い致します
No.2ベストアンサー
- 回答日時:
実は手元に開発環境が無いから適当な回答なんだけど。
。。普通に考えれば分かる範囲で、
┏━━データベース━━━┓┏━━━データソース━━━━━┓
文字列 文字列 数値
>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")
とかでいいのでは?
ご回答ありがとうございます。
ご指摘頂きました文、
SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別")
を追加し、解決できました。
今までは1行ずつUPDATE文を発行していたので、大幅にコードを減らす事が出来ました。
ありがとうございました!
No.3
- 回答日時:
1文字しか入らないのであれば、固定長でサイズ指定でいいのかな?
SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別")
この辺は調べてみて下さい。
No.1
- 回答日時:
質問を読んでいると、データを男、女に変えたことの質問に聞こえる
んだけど、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を使えばいいのでは?と勝手に思った次第です。
それをどこで処理すべきなのでしょうか?
ご指導のほど、よろしくお願い致します
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つのマクロでチェックボックス...
-
Vba SelStart、SelLen教えてく...
-
【VBA】マクロの入ったファイル...
-
現在のブックを閉じないで、マ...
-
ユーザーフォームに別シートか...
-
A列に記載されているフォルダ...
-
VBA 別ブックからコピペしたい...
-
VBA 複数条件の分岐処理の上手...
-
VBAに詳しい方教えてください。
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
Outlookの「受信日時」「件名」...
-
VBA listBoxから
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ExcelのVBAコードについて教え...
-
エクセルのマクロについて教え...
-
Outlookの「受信日時」「送信者...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET DataReaderが開かれている
-
Formのデータが欠落することがある
-
DBNULLについて
-
JavaScriptとACCESSデータベー...
-
dbからデータをとりだす際、sql...
-
C言語からデータベースにアクセス
-
struts 2つの選択肢(selec...
-
「XML over HTTP」「非同期HTTP...
-
Column名を変えた時のUpdate文...
-
JSP データベースへの数回の接続
-
三菱GOTの画面切り替えについて
-
腕時計の時報をならないように...
-
htmlで<form>~</form>を並べて...
-
画面遷移を行わずに同一ページ...
-
プログラミングで例えばゲーム...
-
ボタンが活性化の場合とは、ボ...
-
フォーム上で押されたボタンに...
-
ActiveWorkbook.Pathの一つ下の...
-
リクエストに応じたselectedの...
-
フロントエンドフレームワーク...
おすすめ情報