Column名を変えた時のUpdate文の書き方

このQ&Aのポイント
  • VB2010とSQLServer2008でデータベースの勉強をしております。DataAdapterを使用し、SelectCommand,UpdateCommandを設定、それをDataGridViewに表示させています。
  • Column名とデータをSelectCommandで変更し、Update文でCASE文を使用したい場合、どのように書けばよいのでしょうか?
  • Select文、Update文ともに、CASE句を削除すれば正しく動作することは確認できました。
回答を見る
  • ベストアンサー

Column名を変えた時のUpdate文の書き方

よろしくお願い致します。 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」句を削除すれば正しく動作することは確認できました。 質問する場所を「データベース」と迷ったのですがこちらにしました。 ご指導のほど、よろしくお願い致します

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答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") とかでいいのでは?

hanahana_0
質問者

お礼

ご回答ありがとうございます。 ご指摘頂きました文、 SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別") を追加し、解決できました。 今までは1行ずつUPDATE文を発行していたので、大幅にコードを減らす事が出来ました。 ありがとうございました!

その他の回答 (2)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

1文字しか入らないのであれば、固定長でサイズ指定でいいのかな? SQLDataAapter.UpdateCommand.Parameters.Add("@seibetu", SqlDbType.NChar , 1, "性別") この辺は調べてみて下さい。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答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(v=VS.100).aspx 第4引数:ソース列の名前を"性別"にすればいいのでは? SQL 文はデータベースに丸投げされて、データベースが解釈しますから、別名を 付けられた情報など渡されてもどうにもできません。つまり、SQL 文上で"性別"の 指定は必要ないはずですよね?VB側の設定です。

hanahana_0
質問者

補足

ご回答ありがとうございます! > プログラムは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

  • VB DB更新時にパラメーターへ値のセット

    データベースの更新についてご指導下さい。 VB2010からSQLサーバーのデータベースに接続しております。 dataAdapter.Updateによりデータベースを更新する際の パラメーターへ値をセットする方法を教えて下さい。 テーブル名Test Code Name ------------ A   Suzuki 希望する処理 テキストボックスに入力された名前に変更 例) Suzuki → Yamada ○フォームの変数として定義 Dim dataAdapter As New SqlDataAdapter Dim dataSet As New DataSet ○FormLoad時にSelectCommandとUpdateCommandを設定 Dim SQL As String = "" Dim command As SqlCommand Dim connection As SqlConnection = New SqlConnection(~) SQL = "SELECT * FROM Test WHERE Code = @code " command = New SqlCommand(SQL, connection) dataAdapter.SelectCommand = command dataAdapter.SelectCommand.Parameters.Add("@code", SqlDbType.Char) SQL = "UPDATE Test SET Name = @name WHERE Code = @code" command = New SqlCommand(SQL, connection) dataAdapter.UpdateCommand = command dataAdapter.UpdateCommand.Parameters.Add("@code", SqlDbType.Char) dataAdapter.UpdateCommand.Parameters.Add("@name", SqlDbType.Text, 50) ○データ表示時にはこれで表示されました。 dataAdapter.SelectCommand.Parameters.Item("@code").Value = ComboBoxCode.text dataAdapter.Fill(dataSet) ○このSelectCommandを参考にこのように書いて見たのですが更新されません。 dataAdapter.UpdateCommand.Parameters.Item("@code").Value = ComboBoxCode.Text dataAdapter.UpdateCommand.Parameters.Item("@name").Value = TextBoxName.Text dataAdapter.Update(dataSet) どのようにしたら実行時にパラメーター化したところへデータをセットできるのでしょうか? データセットに値が入っていないのでは?と予想したのですが…。

  • MERGE文を単体テーブルに対して行いたい

    Oracle初心者です。 宜しくお願い致します。 MERGE文を1つのテーブルに対して行いたいのですが、エラーになってしまいます。 すみませんが、教えて下さい。 MERGE INTO TEST A USING TEST B ON (A.SEQ_NO = B.SEQ_NO AND A.SEQ_NO2 = B.SEQ_NO2 AND A.SEQ_NO3 = B.SEQ_NO3) WHEN MATCHED THEN UPDATE文 WHEN NOT MATCHED THEN    INSERT文;

  • カラム名について。

    忙しいところ申し訳ありません。 ● 使ってるソフト ORACLE SQLplus <状態> データベースについての質問なんですが、 1.カラム名を日本語してあります。 2.select文コマンドで入力したとき、ORACLE SQLplus でカラム名が表示されません。 データは取れているのですが、日本語にしているとカラム名が表示されないということが、あるのでしょうか?

  • UPDATEのCASE文で・・

    SQLの独学をはじめて間もない素人です。 今case文を使って・・a_flg、b_flgを更新というコードを考えたのですが・・↓ UPDATE tm_results_payment SET a_flg = ( CASE WHEN b_flg=1 AND a_flg=1 THEN '0' END ) b_flg = ( CASE WHEN b_flg=1 AND a_flg=1 THEN '1' ELSE b_flg END ) CASE文は同じ条件です。値を2個とも変更したいので上の処理を考えました。 しかし、どうやら先に最初のCASE文でa_flgを0に変えてしまっているので、 次のCASE文では処理をしてくれません・・; 同時進行で値を更新する方法ってどうすればよいのでしょうか・・; よろしくお願いいたします。

  • MySQLのトリガの制御文について

    MySQLのトリガで次のようなコーディングを行いましたが、エラーが発生して、動作しません。 ------------------------------------------------------------------------------------------------- begin UPDATE テーブルA SET テーブルAカラムX = 値, テーブルAカラムY = 値, CASE WHEN テーブルAカラムZ = 1 THEN テーブルAカラムR = 1 WHEN テーブルAカラムZ = 2 THEN テーブルAカラムR = 2 END; end -------------------------------------------------------------------- ENDをEND CASEにしたり消したり、;を色々な位置につけたり消したりしましたが、エラーが発生します。 ストアドの方でselect文中にif文やcase文を入れましたが、エラーが発生します。 大変困っております。 ご協力をお願い致します。 各バージョンは最新バージョンとします。

    • ベストアンサー
    • MySQL
  • case構文の条件について

    cseで ------------------------------- SELECT a,b, CASE c WHEN 1 THEN "○" WHEN 0 THEN "×" END from A ; ------------------------------- というSQL文を実行すると カラムa,bには値が入っていますが カラムcは空欄になってしまいます。 CASE構文のところを、 ------------------------------- CASE c WHEN 1 THEN 1 WHEN 0 THEN "×" END ------------------------------- とするとカラムcの取得結果は、 1 × になります。 どうやら、THENを両方全角文字にすると空欄に なるようです。 ちなみにカラムcは"tinyint(1)"です。 "varchar(10)"にしても取得結果は 同じになってしまいます。 なぜこうなるのか、また、 どうやったら"○×"に限らず全角文字を 条件に出来るか教えてください。

  • ACCESS2000でのCASE文

    SQL Server でいう SELECT CASE ○○ WHEN ▲▲ THEN ××, WHEN ▲▲ THEN ×× といったSQLをACCESS2000のSQLにするとき どういったSQLを使えばいいでしょうか? 調べたところ2つのパターンまでなら IIF関数で間に合うようですが、複数になったときに 困っています。 どなたか回答よろしくお願いします。

  • MySQLのUPDATE文について

    以下のようなスクリプトを書いた時に、phpMyAdminで、テーブルの中身をみると、 photo カラムには、添付画像ファイルのファイル名の値が入っているのに、 bbs.php側からアップデートしようとすると、ip_add以下passwordまでのカラムの 中身が空なのです。SQLの文法的に何かまちがってるでしょうか? 一応、ラストレコードのカラムを更新することを念頭に置いておりますが。 <file_upload.php> $sql = "INSERT INTO bbstbl_test (photo) VALUES('$upfilename');"; -------------------------------------------------------------------------------- <bbs.php> $sql = "UPDATE bbstbl_test SET ip_add = $ip_add, date = $date, name = $name, email = $email, title = $title, message = $message, password = $password;";

    • ベストアンサー
    • PHP
  • SQL CASE 文について

    開発環境 SQLSERVER VB2005 SQLのCASE文についての質問ですが、DATE型のデータが有効値の場合は”スペース”それ以外の場合は格納されているDATE型を表示したいのですが、どなたかご教授お願いいたします。下記のSQLでは全ての日付が出てしまいます。 SELECT CASE 日付 WHEN '2000/01/01' THEN ' '     ELSE 日付          END AS Expr1 FROM  テーブル CASE文以外でもできますか? よろしくお願いいたします。

  • Update文の書き方について

    下記のデータベースで『nameフィールドに値がセットされているもののみ』、別の文字に置き換えたいと思いますが、例えば『UPDATE `test` SET `name` = "かきくけ";』のような書き方ではnameフィールドのすべてのレコードを更新してしまいます。 その為、上記SQL文のSET以降で『nameフィールドに値がセットされているもののみ』という条件を付加すれば良いと思ったのですが、どのようなSQL文を書けば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 CREATE TABLE IF NOT EXISTS `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; INSERT INTO `test` (`id`, `name`) VALUES (1, 'あいうえお'), (2, ''), (3, 'さしす'), (4, ''), (5, 'ab'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう