C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Entitey Framework Select文 C#

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■98848 / inTopicNo.1)  Entitey Framework Select文 C#
  
□投稿者/ 初心のもの (21回)-(2022/01/06(Thu) 12:59:04)

分類:[C#] 



 あけましておめでとうございます。

 今回はお尋ねしたいことなのですが、C#を始めて1か月半が立ちました。
 そんな私が今したいことは、C#の.NETを使ってSQLDBにアクセスして、ボタンを押したらDataGridViewにTable情報をすべて出したい。というものです。


         private void button1_Click(object sender, EventArgs e)
        {
            var testStr = "SELECT";

            textBox1.Text = textBox1.Text.PadLeft(7, '0');
            using (var testContext = new TestContext())
            {
                if (textBox1.Text != "")
                {
                    var day = new DateTime();
                    var id = textBox1.Text;
                    var Id = id;            //見るだけならこれ↓
                    var table1List = testContext.Table_1.Where(x => x.ID == Id).ToList();
                    foreach (var table1 in table1List)
                    {

                        dataGridView1.DataSource = table1List;
                        LogManager.GetLogger(GetType().FullName).Info($"{testStr}");
                    }
                }

            }
        }

 textboxでTable内にあるIDを選択すればその値は取得することができます。
 これを指定せず、Table内の情報を一括で取得したいところです。
 linqなどの意味も分かっていません
 
 説明不足かもしれませんが回答いただけると幸いです。

引用返信 編集キー/
■98849 / inTopicNo.2)  Re[1]: Entitey Framework Select文 C#
□投稿者/ Hongliang (1208回)-(2022/01/06(Thu) 13:26:43)
条件不要なら、単にWhere句を除いて testContext.Table_1.ToList() にすればいいかと思いますが。

> foreach (var table1 in table1List)
> {
>     dataGridView1.DataSource = table1List;
>     LogManager.GetLogger(GetType().FullName).Info($"{testStr}");
> }

ループする意味が見当たりませんが、なぜforeachしているのでしょうか。

引用返信 編集キー/
■98850 / inTopicNo.3)  Re[1]: Entitey Framework Select文 C#
□投稿者/ WebSurfer (2395回)-(2022/01/06(Thu) 13:41:48)
No98848 (初心のもの さん) に返信

> Entitey Framework Select文 C#
> C#の.NETを使ってSQLDBにアクセスして、ボタンを押したらDataGridViewにTable情報をすべて
> 出したい。というものです。

DataGridView を使う Windows Forms アプリであれば、Entity Framework + Linq to Entities
ではなくて、昔からある ADO.NET + SqlClient を使ったアプリを作ることをお勧めします。

データソースが SQL Server などのデータベースのテーブルで、そのレコード一覧を DataGridView
に表示し、ユーザーが DataGridView を見て編集した結果を、元のデータベースのテーブルに
反映させるというようなことがやりたいこととと想像してます。

であれば一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみることを
お勧めします。

以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

10 行でズバリ !! 非接続型のデータ アクセス
https://github.com/microsoftarchive/msdn-code-gallery-community-0-9-non-alphabetic/tree/master/10%20%E8%A1%8C%E3%81%A7%E3%82%BA%E3%83%90%E3%83%AA%20!!%20%E9%9D%9E%E6%8E%A5%E7%B6%9A%E5%9E%8B%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%20%28ADO.NET%29%20%28VB%29

新しいデータ ソースの追加
https://docs.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2019

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet +
TableAdapter + TableAdapterManager を作って、それを利用してアプリを作ると、

DataGridview ⇔ BindingSource / BindingNavigator ⇔ DataSet / DataTable ⇔ DataAdapter ⇔ SQL Server

という構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

それにどういうメリットがあるかと言うと、以下の記事の「非接続型のデータ更新」のセクション
の図1と図2を見てください。文章は読まなくてもいいので図だけ見てください。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

図2の DataSet 右側に BindingSource / BindingNavigator 経由で DataGridView が接続されてい
ると思ってください。

ユーザーが DataGridView を操作(行の削除・追加・訂正)した結果は図1にあるように DataSet /
DataTable に反映されます。ユーザーの編集操作が終わったら Update メソッドで図1の編集結果が
一度に DB に反映されます。そういうアプリが簡単に作れるようにできているのです。
引用返信 編集キー/
■98851 / inTopicNo.4)  Re[1]: Entitey Framework Select文 C#
□投稿者/ WebSurfer (2396回)-(2022/01/06(Thu) 14:04:47)
No98848 (初心のもの さん) に返信

No98850 の私のレスを読んでもらっても、なお Entity Framework + Linq to Entities +
DataGridView としたい、表示さえできればよい(DB の追加・削除・更新は不要)という
ことであればその旨レスしてください。

あと、開発環境(OS, Visual Studio のバージョン、.NET Framework か Core のどっちか
とそのバージョンなど)を書くようにしてください。
引用返信 編集キー/
■98852 / inTopicNo.5)  Re[2]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (22回)-(2022/01/06(Thu) 14:09:04)
No98849 (Hongliang さん) に返信
> 条件不要なら、単にWhere句を除いて testContext.Table_1.ToList() にすればいいかと思いますが。

  できました! ありがとうございます。ですが一つ問題があって
    public partial class Table_1
    {
        [StringLength(10)]
        public string ID { get; set; }

        [StringLength(50)]
        public string Name { get; set; }

        [StringLength(50)]
        public string HName { get; set; }

        [StringLength(50)]
        public string EnName { get; set; }

        [StringLength(10)]
        public string Gender { get; set; }

        //[Column(TypeName = "date")]
        //public int Day { get; set; }  ←ここの型
    }

 コメントアウトしてある[Day]なのですが、SQL上でのカラムは[data]型で登録してあります。
 ここには生年月日を入力する形になっているのですが、[int][string]にしてもここがエラーになり動作してくれません。
 ここは何型にするのがよいのでしょう?

> ループする意味が見当たりませんが、なぜforeachしているのでしょうか。
 ネット上にあったものなのでそのまま使うものなのだと思っていました。
         private void button1_Click(object sender, EventArgs e)
        {
            using (var textcontext = new TestContext())
            {
                var list=textcontext.Table_1.ToList();
                dataGridView1.DataSource = list;
            }
        }
 教えていただいた方法でも成功しました。

引用返信 編集キー/
■98853 / inTopicNo.6)  Re[2]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (23回)-(2022/01/06(Thu) 14:16:33)
No98850 (WebSurfer さん) に返信

> DataGridView を使う Windows Forms アプリであれば、Entity Framework + Linq to Entities
> ではなくて、昔からある ADO.NET + SqlClient を使ったアプリを作ることをお勧めします。

 まさにこれを使ってやってます!

> 新しいデータ ソースの追加
> https://docs.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2019

 すみません、、このURLしか確認ができませんでした、、
 見てみたら自分がやっているのは既存のDBにアクセスするものでした(一番右のやつ)

> それにどういうメリットがあるかと言うと、以下の記事の「非接続型のデータ更新」のセクション
> の図1と図2を見てください。文章は読まなくてもいいので図だけ見てください。
> ユーザーが DataGridView を操作(行の削除・追加・訂正)した結果は図1にあるように DataSet /
> DataTable に反映されます。ユーザーの編集操作が終わったら Update メソッドで図1の編集結果が
> 一度に DB に反映されます。そういうアプリが簡単に作れるようにできているのです。

 すごく扱えたらよさそうですね!調べてきます!

 
引用返信 編集キー/
■98854 / inTopicNo.7)  Re[2]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (24回)-(2022/01/06(Thu) 14:22:03)
No98851 (WebSurfer さん) に返信
> ■No98848 (初心のもの さん) に返信
>
> No98850 の私のレスを読んでもらっても、なお Entity Framework + Linq to Entities +
> DataGridView としたい、表示さえできればよい(DB の追加・削除・更新は不要)という
> ことであればその旨レスしてください。

 もちろんそれはすべてやりたいです。
 ただ何もわからないのでとりあえずSelectのやり方を考えてからinsert、updateを書いていきたいと思います。
 最終的には、飛んできたFileを自動で保存するか、更新するアプリを作らないといけない予定ですので、

> あと、開発環境(OS, Visual Studio のバージョン、.NET Framework か Core のどっちか
> とそのバージョンなど)を書くようにしてください。

 Windows .NET Framework Visual Studio2019です
 以後気をつけさせていただきます
引用返信 編集キー/
■98855 / inTopicNo.8)  Re[3]: Entitey Framework Select文 C#
□投稿者/ WebSurfer (2397回)-(2022/01/06(Thu) 14:32:59)
No98853 (初心のもの さん) に返信

>>新しいデータ ソースの追加
>>https://docs.microsoft.com/ja-jp/visualstudio/data-tools/add-new-data-sources?view=vs-2019
>
>  すみません、、このURLしか確認ができませんでした、、

それ以外の URL はこのサイトのリンクの作り方で途中で切れたようになってしまい、クリック
しても飛べません。URL の文字列全体をコピーしてブラウザのアドレスバーに貼ってください。

あと、上の記事ではドラッグ&ドロップで DataGridView ではなく TextBox を使う画像が貼っ
てありますが、左のウィンドウの Customer のドロップダウンを変更すれば DataGridView に
なります。

>  見てみたら自分がやっているのは既存のDBにアクセスするものでした(一番右のやつ)

どいう言意味でしょう? 将来は EF Code First で DB を生成したい? 「一番右のやつ」と
は何でしょう?
引用返信 編集キー/
■98856 / inTopicNo.9)  Re[3]: Entitey Framework Select文 C#
□投稿者/ Hongliang (1209回)-(2022/01/06(Thu) 15:07:07)
>  コメントアウトしてある[Day]なのですが、SQL上でのカラムは[data]型で登録してあります。
>  ここには生年月日を入力する形になっているのですが、[int][string]にしてもここがエラーになり動作してくれません。
>  ここは何型にするのがよいのでしょう?

エラーになり、ではなくて、発生したエラーの詳細なメッセージをお書きください。
できればコピー&ペーストで。

日付及び時刻は、.NETにおいてはDateTime型で扱います。
引用返信 編集キー/
■98857 / inTopicNo.10)  Re[4]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (26回)-(2022/01/06(Thu) 15:13:27)
No98855 (WebSurfer さん) に返信
> ■No98853 (初心のもの さん) に返信

> それ以外の URL はこのサイトのリンクの作り方で途中で切れたようになってしまい、クリック
> しても飛べません。URL の文字列全体をコピーしてブラウザのアドレスバーに貼ってください。
 確認できました!

> 将来は EF Code First で DB を生成したい? 「一番右のやつ」と
> は何でしょう?

 そこの使い方もいまいちわからないのですが、今使っているのは[Code First]です
 
引用返信 編集キー/
■98858 / inTopicNo.11)  Re[4]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (27回)-(2022/01/06(Thu) 15:17:07)
No98856 (Hongliang さん) に返信

> 日付及び時刻は、.NETにおいてはDateTime型で扱います。
 DateTimeに変更したらできました!

 一つ疑問なのですが
    public partial class Table_1
    {
        [StringLength(10)]
        public string ID { get; set; }

        [StringLength(50)]
        public string Name { get; set; }

        [StringLength(50)]
        public string HName { get; set; }

        [StringLength(50)]
        public string EnName { get; set; }

        [StringLength(10)]
        public string Gender { get; set; }

        [Column(TypeName = "date")]
        public DateTime? Day { get; set; } ←
    }

 ここには何故[?]が必要なのでしょう。
  [?]を除いて実行すると
System.Data.ConstraintException: 'The 'Day' property on 'Table_1' could not be set to a 'null' value. You must set this property to a non-null value of type 'System.DateTime'. '
 このようなメッセージが出ます
 

引用返信 編集キー/
■98859 / inTopicNo.12)  Re[5]: Entitey Framework Select文 C#
□投稿者/ 魔界の仮面弁士 (3270回)-(2022/01/06(Thu) 15:23:56)
No98858 (初心のもの さん) に返信
>  ここには何故[?]が必要なのでしょう。

null 値のためです。
エラーメッセージにも null value や non-null value といった内容が記載されていますよね。


string 型の変数は null を保持できますが、
DateTime 型や int 型では null を保持できません。
DateTime? 型や int? 型ならば null を保持できます。
引用返信 編集キー/
■98860 / inTopicNo.13)  Re[6]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (29回)-(2022/01/06(Thu) 15:38:07)
No98859 (魔界の仮面弁士 さん) に返信
> ■No98858 (初心のもの さん) に返信
> string 型の変数は null を保持できますが、
> DateTime 型や int 型では null を保持できません。
> DateTime? 型や int? 型ならば null を保持できます。

 そういう理由なんですね。
 理解できました。ありがとうございます!

 皆様ご協力感謝申し上げます。。
解決済み
引用返信 編集キー/
■98861 / inTopicNo.14)  Re[5]: Entitey Framework Select文 C#
□投稿者/ WebSurfer (2398回)-(2022/01/06(Thu) 16:56:28)
No98857 (初心のもの さん) に返信

>  そこの使い方もいまいちわからないのですが、今使っているのは[Code First]です

SQL Server のテーブルとエンティティクラス Table_1 の型の不整合でエラーが出ている
ようですが、Code First で作ってそうなることは考えにくいのですが?
引用返信 編集キー/
■98862 / inTopicNo.15)  Re[6]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (31回)-(2022/01/07(Fri) 10:14:52)
No98861 (WebSurfer さん) に返信
> ■No98857 (初心のもの さん) に返信 
> SQL Server のテーブルとエンティティクラス Table_1 の型の不整合でエラーが出ている
> ようですが、Code First で作ってそうなることは考えにくいのですが?

 public DateTime? Day { get; set; }

 おそらくここ変数をいじったからだと思います。
 ここを[int][string]で実行していたので

引用返信 編集キー/
■98863 / inTopicNo.16)  Re[7]: Entitey Framework Select文 C#
□投稿者/ WebSurfer (2399回)-(2022/01/07(Fri) 11:13:47)
No98862 (初心のもの さん) に返信

> public DateTime? Day { get; set; }
>
> おそらくここ変数をいじったからだと思います。
> ここを[int][string]で実行していたので

レス有難うございます。最終的に上記のように変更して DB を作り直したのですね。



ところで、今更ながらですが、Windows Forms + DataGridView は Entity Framework とは
あまり親和性が高くなさそうで、表示さえできればよいのであればともかく、DB の追加・
削除・更新も行うとなると参考になる記事は少なそうです(実際、自分は適当な記事は見つ
けられませんでした)。

なので、Entity Framework にこだわるのであれば、WPF + Entity Framework も視野に入
れた方が良いかもしれません。

興味がありましたら wpf entity framework crud などをキーワードにいググってみてくだ
さい。以下のような記事がヒットするはずです。

WPF と Entity Framework 6 を使用して単純なデータ アプリケーションを作成する
https://docs.microsoft.com/ja-jp/visualstudio/data-tools/create-a-simple-data-application-with-wpf-and-entity-framework-6?view=vs-2019

WPF CRUD With DataGrid, Entity Framework And C#.NET
https://dotnetgenetics.blogspot.com/2018/03/wpf-crud-with-datagrid-and-entity.html

上の前者の記事は No98850 で紹介した「10 行でズバリ !! 非接続型のデータ アクセス」と
ほぼ同じことをするのですが、コード量が大幅に増えるのが問題かもしれませんが。
解決済み
引用返信 編集キー/
■98864 / inTopicNo.17)  Re[8]: Entitey Framework Select文 C#
□投稿者/ 初心のもの (32回)-(2022/01/07(Fri) 13:36:53)
2022/01/07(Fri) 15:05:02 編集(投稿者)
2022/01/07(Fri) 15:04:58 編集(投稿者)

No98863 (WebSurfer さん) に返信
> ■No98862 (初心のもの さん) に返信

> 興味がありましたら wpf entity framework crud などをキーワードにいググってみてくだい
> WPF と Entity Framework 6 を使用して単純なデータ アプリケーションを作成する
> https://docs.microsoft.com/ja-jp/visualstudio/data-tools/create-a-simple-data-application-with-wpf-and-entity-framework-6?view=vs-2019
>
> WPF CRUD With DataGrid, Entity Framework And C#.NET
> https://dotnetgenetics.blogspot.com/2018/03/wpf-crud-with-datagrid-and-entity.html

 教えていただきありがとうございます!
 是非参考にさせていただきます!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ