DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン データセット定義ファイルからDataTable /ナンバー (19/02/25(Mon) 16:27) #34159
Nomalアイコン Re[1]: データセット定義ファイルからDataTable /魔界の仮面弁士 (19/02/25(Mon) 17:15) #34161
  └Nomalアイコン Re[2]: データセット定義ファイルからDataTable /ナンバー (19/02/26(Tue) 14:10) #34162 解決み!
    └Nomalアイコン Re[3]: データセット定義ファイルからDataTable /魔界の仮面弁士 (19/02/26(Tue) 16:41) #34163 解決み!


親記事 / ▼[ 34161 ]
■34159 / 親階層)  データセット定義ファイルからDataTable
□投稿者/ ナンバー 一般人(2回)-(2019/02/25(Mon) 16:27:43)
  • アイコン環境/言語:[c# 6] 
    分類:[.NET] 

    データセット定義ファイル(xsdファイル)を利用して、DataTableを作成しました。

    参考にしたのは下記のサイトになります。
    https://www.ipentec.com/document/csharp-database-create-dataset

    できたのは下記のURLのようになります。
    https://mscdn.ipentec.com/document/image/csharp-database-create-dataset-05?maxwidth=1440

    MyDataSet.xsdファイルのSimpleProductというDataTableができました。
    ----
    ここからが知りたいことです。

    1.
    SimpleProductというDataTableをインスタンス化するには、このような方法をとりましたが
    あってるでしょうか?

    var dt = new DataTable();
    dt = MyDataSet.SimpleProduct();

    2.
    Form上のボタンを押すたびに、
    このDataTableに行を追加したいと思います。SimpleProductテーブルにはID(主キー)、ProductName、Priceと列情報があります。

    dt.Rows.Add(dt.NewRow()); // ←ここでエラー発生
    dt.[0]["id"] = "1";
    dt.[0]["ProductName"] = "A";
    dt.[0]["Price"] = "100";

    とすると、
    型 'System.Data.NoNullAllowedException' のハンドルされていない例外が System.Data.dll で発生しました

    追加情報:列 'id' に nulls を使用することはできません。

    というエラーメッセージが表示されます。idが主キーだからそのようにメッセージがでるのはわかる気がしますが、
    行を追加するにはどのようにすればいいでしょうか?

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34159 ] / ▼[ 34162 ]
■34161 / 1階層)  Re[1]: データセット定義ファイルからDataTable
□投稿者/ 魔界の仮面弁士 大御所(1203回)-(2019/02/25(Mon) 17:15:40)
  • アイコンNo34159に返信(ナンバーさんの記事)
    > var dt = new DataTable();
    > dt = MyDataSet.SimpleProduct();

    dt への代入を 2 回行っているのは何故でしょうか?

    たとえば普段、
     string s = ""; // 1 回目の代入
     s = textBox1.Text; // 2 回目の代入
    と書くのではなく、
     string s = textBox1.Text; // 1 回目の代入
    と書きますよね。


    > 1.SimpleProductというDataTableをインスタンス化するには、このような方法をとりましたが
    > あってるでしょうか?

    そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?


    // 案1
    var ds = new MyDataSet();
    var dt = ds.SimpleProduct;

    // 案2
    var dt = new MyDataSet().SimpleProduct;

    // 案3
    var dt = new MyDataSet.SimpleProductDataTable();


    お奨めは 案1 ですが、どの方法でも構いません。
    ただし 案3 の方法だと、dt.DataSet が null になる点にご注意ください。


    上記の dt は System.Data.DataTable 型ではなく、それを継承した
    プロジェクトの名前空間.MyDataSet.SimpleProductDataTable 型である点が肝です。



    > 2.
    > Form上のボタンを押すたびに、
    > このDataTableに行を追加したいと思います。

    (1) MyDataSet.xsd を含むプロジェクトをコンパイルします。

    (2) フォームデザイナーを開くと、ツールボックス先頭に "MyDataSet" が現れるので、
     それを Form1 にドロップします。"myDataSet1" が貼られるはず。

    (3) button1_Click に以下を記述します。
    this.myDataSet1.SimpleProduct.AddSimpleProductRow("1", "A", 100);


    今回の場合、id 列が主キー設定されているようなので、
    同じ id を追加で登録しようとすると、キー重複で制約エラーになります。
    (ただし DataSet の EnforceConstraints を false にしていた場合は、制約エラーが無視されます)


    > dt.Rows.Add(dt.NewRow()); // ←ここでエラー発生
    > dt.[0]["id"] = "1";
    > dt.[0]["ProductName"] = "A";
    > dt.[0]["Price"] = "100";

    「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?


    それと、Price 列が 数値(int とか decimal とか)ではなく
    数字(string) な点も気にかかります。
    列のデータ型は、DataSet デザイナーで列を選択して、
    DataType プロパティから確認できますので、確認しておいてください。



    > 行を追加するにはどのようにすればいいでしょうか?

    【型付の DataTable に行を追加する場合】
    // 案1
    dt.AddSimpleProductRow("1", "A", 100);


    // 案2
    var newRow = dt.NewSimpleProductRow();
    newRow.id = "1";
    newRow.ProductName = "A";
    newRow.Price = 100;
    dt.AddSimpleProductRow(newRow);




    【素の DataTable に行を追加する場合】
    // 案1
    dt.Rows.Add("1", "A", 100);

    // 案2
    DataRow newRow = dt.NewRow();
    newRow["id"] = "1";
    newRow["ProductName"] = "A";
    newRow["Price"] = 100;
    dt.Rows.Add(newRow);
違反を報告
[ 親 34159 / □ Tree ] 返信 削除キー/

▲[ 34161 ] / ▼[ 34163 ]
■34162 / 2階層)  Re[2]: データセット定義ファイルからDataTable
□投稿者/ ナンバー 一般人(5回)-(2019/02/26(Tue) 14:10:24)
  • アイコン>そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?

    はい、コンパイルエラーになりませんでした。

    >上記の dt は System.Data.DataTable 型ではなく、それを継承した
    >プロジェクトの名前空間.MyDataSet.SimpleProductDataTable 型である点が肝です。

    なるほど、よく理解できました。

    >「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    >その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?

    コンパイルエラーにはならず、実行時にエラーがでました。

    無事に疑問だったことが解決されました。ありがとうございます。
解決み!
違反を報告
[ 親 34159 / □ Tree ] 返信 削除キー/

▲[ 34162 ] / 返信無し
■34163 / 3階層)  Re[3]: データセット定義ファイルからDataTable
□投稿者/ 魔界の仮面弁士 大御所(1204回)-(2019/02/26(Tue) 16:41:17)
  • アイコンNo34162に返信(ナンバーさんの記事)
    > >そもそも『dt = MyDataSet.SimpleProduct();』だとコンパイルエラーになりませんでしたか?
    > はい、コンパイルエラーになりませんでした。

    それは妙ですね。

    「dt = new MyDataSet.SimpleProduct();」や
    「dt = myDataSet.SimpleProduct;」ならばまだしも、
    「dt = MyDataSet.SimpleProduct();」は、通常ならエラーになるはずなのですが。

    エラーにならなかったのであれば、MyDataSet.cs に対して、
    static な「SimpleProduct メソッド」を追加していたのかもしれません。


    > >「dt.Rows.Add(dt.NewRow());」は実行時エラーで済みそうですが、
    > >その後の「dt.[0]」という構文は、そもそもコンパイルエラーになりませんか?
    > コンパイルエラーにはならず、実行時にエラーがでました。

    「dt.[0]」でなく
    「dt[0]」だったということはないですか?

    「dt.[0]」な記述は、C# では構文エラー『識別子がありません』となるはずです。
    「dt[0]」や「dt.Rows[0]」という構文ならありえますが。


    もしくは、コンパイルに失敗した後の
    『ビルド エラーが発生しました。続行して、最後に成功したビルドを実行しますか?』
    の警告を無視して実行していたとか…。
解決み!
違反を報告
[ 親 34159 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -