none
Linq to SQLを使ってbit型のデータをbool型のデータとして取得したい RRS feed

  • 質問

  • いつも参考にさせていただいております。

    以前からプログラムに興味があり、このたび、社内で使う顧客管理ソフトを勉強がてら作っている初学者です。

    説明が不十分なところもあるかと思いますが、ご指導いただければ幸いです。

    これまでは、データベースにAccess 2007を使い、C#のOleDBでアクセスして作っていました。

    現在の環境は、以下の通りです。

    言語 : C#

    データベース : SQLServer2008 Express

    環境を変更したのは、AccessよりもSQLServerの方が、複数人で使う場合にデータが壊れにくい、データアクセスが速いなどのメリットがあるということをネットで見たからです。

    これまでAccess 2007で作ってきたものに、以下のようなテーブルがあります。

    テーブル名 : t_メールマガジン希望者

    顧客ID : 長整数型 (顧客マスタの顧客IDとリレーションシップを設定しています)

    メールマガジン希望 : Yes/No型

    上記と同じ構造のテーブルをSQLServerに作りました。

    ただし、SQLServerにはYes/No型がないため、フィールドの型をbit型とし、「0=false、1 = true」としました。

    これをLinq To SQLで取得し、dataGridViewのDataSourceに設定すると、Accessで作っていた時にはメールマガジン希望フィールドはチェックボックスになっていたのですが、SQLServerかた取得するとtrue または falseと文字列で表示されてしまいます。

    SQLServerに書き換えた後でも、dataGridviewのDataSourceを、TableAdapterで取得したDataTableで設定した時には、チェックボックスで表示されていました。

    Linq To SQLでも、bit型のフィールドを、Yes/No型(bool型)に変換して取得する方法はありませんでしょうか?

    Linq To SQL自体、初めて使いますので、型変換の方法などの理解不足だと思いますが、ネットを探しても理解できるものがありませんでした。

    Linq To SQLは、(きちんと理解していれば)プログラムが簡潔に書けてメンテナンス性が向上し、接続速度もTableAdapterを使うのと同等だと聞いて挑戦しています。

    ぜひ使いこなせるようになりたいと思っていますので、ご指導のほど、よろしくお願いいたします。



    • 編集済み RFNS 2012年11月15日 3:26
    2012年11月15日 3:21

回答

  • おそらく、SQL Serverにおけるその列がnullを許容しているからでしょう。

    #あくまで個人的な意見です。
    社内用であるということは、データベースもご自分で構築、管理されるということですよね? また、初学者ということはSQL Serverにもあまり慣れていないということですよね?
    であれば、まずは、SQLをしっかり学ぶことをされた方が良いと思います。それが難しいのであれば、Linq To SQLでの構築後でも良いので、SQLについてしっかり学んでください。
    C#でコードを書くよりも、ストアドプロシージャを使ってデータベース側で処理を行って結果を取得する方が、効率的かつ簡単にできることもあります。PIVOTやCTEなども書けるようになると世界が広がります。
    つまり、私が言いたいのは、c#だけではなく、SQLもしっかり書けるプログラマーを目指して下さいということです。もちろん、RFNSさんの都合もありますから、RFNSさんの都合で進められて全く構わないのですが、私の経験上、業務アプリを組むのであればデータベースはほぼ必須ですので、SQLを自由に使いこなせるというのは、大きな武器になります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年11月21日 4:09
    • 回答としてマーク 佐伯玲 2012年11月26日 2:45
    2012年11月15日 7:01
    モデレータ
  • これって LinqToSQL で bool なり bool? なりとして取得されているエンティティ型を、DataGridView に表示するときに、TextBoxColumn に表示しているから、画面上は True, False と表示されているだけでは?

    DataGridView に該当の列にバインドされたものはフォームデザイナで設定していますか? 自動生成させていますか? 自動生成しているのであれば、フォームデザイナで CheckBoxColumn を追加してから実行してみるとよいのではないでしょうか?(手で作成しておいたものは自動生成時に除外されて、手で作成されたほうが採用される・・・はず)

    • 回答の候補に設定 佐伯玲 2012年11月21日 4:09
    • 回答としてマーク 佐伯玲 2012年11月26日 2:44
    2012年11月15日 8:59

すべての返信

  • おそらく、SQL Serverにおけるその列がnullを許容しているからでしょう。

    #あくまで個人的な意見です。
    社内用であるということは、データベースもご自分で構築、管理されるということですよね? また、初学者ということはSQL Serverにもあまり慣れていないということですよね?
    であれば、まずは、SQLをしっかり学ぶことをされた方が良いと思います。それが難しいのであれば、Linq To SQLでの構築後でも良いので、SQLについてしっかり学んでください。
    C#でコードを書くよりも、ストアドプロシージャを使ってデータベース側で処理を行って結果を取得する方が、効率的かつ簡単にできることもあります。PIVOTやCTEなども書けるようになると世界が広がります。
    つまり、私が言いたいのは、c#だけではなく、SQLもしっかり書けるプログラマーを目指して下さいということです。もちろん、RFNSさんの都合もありますから、RFNSさんの都合で進められて全く構わないのですが、私の経験上、業務アプリを組むのであればデータベースはほぼ必須ですので、SQLを自由に使いこなせるというのは、大きな武器になります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年11月21日 4:09
    • 回答としてマーク 佐伯玲 2012年11月26日 2:45
    2012年11月15日 7:01
    モデレータ
  • これって LinqToSQL で bool なり bool? なりとして取得されているエンティティ型を、DataGridView に表示するときに、TextBoxColumn に表示しているから、画面上は True, False と表示されているだけでは?

    DataGridView に該当の列にバインドされたものはフォームデザイナで設定していますか? 自動生成させていますか? 自動生成しているのであれば、フォームデザイナで CheckBoxColumn を追加してから実行してみるとよいのではないでしょうか?(手で作成しておいたものは自動生成時に除外されて、手で作成されたほうが採用される・・・はず)

    • 回答の候補に設定 佐伯玲 2012年11月21日 4:09
    • 回答としてマーク 佐伯玲 2012年11月26日 2:44
    2012年11月15日 8:59
  • こんにちは、RFNS さん
    フォーラムオペレータの佐伯 玲 です。

    その後の状況はいかがでしょうか?
    みなさんの返信が参考になると思われましたので「回答としてマーク」させていただきました。

    MSDN フォーラムでは参考になった返信に投票を行っていただくと共に解決につながる返信に「回答してマーク」していただくことをお願いしております。
    「回答としてマーク」がついているスレッドはその質問が解決したことを示しスレッドの一覧等からでもスレッドのステータスとして表示されます。
    また、もしご確認いただいて解決されなかったようでしたら「回答としてマーク」は投稿者の方があとから解除することも可能です。

    今後ともMSDN フォーラムを宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年11月26日 2:44