none
TableAdapterの利用について RRS feed

  • 質問

  • こんにちは。

    データソースにてTableAdapterを作成し、データソースのところに表示されるテーブルをフォームにドラッグアンドドロップして
    自動的に作成されたものを使用してDBへの保存を行おうと思ったところ、以下の動作の理由がよくわかりません。

    日付型のデータがある場合、フォーム上にdatetimepickerが作成されると思います。
    その場合、今日の日付が規定値として入っているので、Nullになることはあり得ないと思うのですが、
    「NULLを入れることはできない」というエラーが出ます。
    (DB側ではNULLを許可していません。)
    datetimepickerはNULLにしたくてもできないと認識をしていたのですが、違っているのでしょうか。
    ヘルプを見てもそれらしき記述を見つけることができませんでした。

    また、ツールストリップバーにある「プラス記号」のボタンをクリックした際に、もととなるテーブルに1件でもレコードがあれば
    主キーの最大値+1を主キーのフィールドがバインドされているテキストボックスに表示してくれるのですが、
    レコードが1件もない場合は、まず「0」が表示され、保存ボタンをクリックした際に「1」を取得するという動作をしました。
    現状は「+」ボタンをクリックした際にdatatableのレコードが0件の場合には、「1」を表示するようにプログラムを書いているのですが、
    何も手を加えない状態では、上記の動作は仕方がないのでしょうか。

    このあたりの点がヘルプを見ても分からなかったので、ご教授願えますでしょうか。
    2010年3月18日 9:26

回答

  • まず、DateTimePicker の件、、、
    DateTimePicker が null なのではなく
    初期値が入っていても null で更新しようとしてしまっているのだと思います。
    これがバグなのか仕様なのかは、
    残念ながらそもそも DataAdapter の仕様がわからないので判断できません。

    次に主キーの件、、、

    > レコードが1件もない場合は、まず「0」が表示され

    ↑試してみましたが「0」は表示されません。
    なにか、設定してますか?
    もっとも「0」ではなく空白が表示されるだけなので
    問題の解決には直接つながらないかもしれませんがいちおう確認です。

    以上、DataAdapter は詳しくないですがしばらく返信が無いようなので口火を切ってみました。

    2010年3月24日 9:06
  • ややこしそうな話でしたので敬遠していたのですが、調べてみました。

    ◆TI-cb400 さん
    > datetimepickerはNULLにしたくてもできないと認識をしていたのですが、違っているのでしょうか。

    新規追加行の各項目の値は DefaultValue 値になります。
    デフォルトの場合は DBNull.Value のため、今回の日付項目も DBNull.Value になっていると思います。
    ですが、DateTimePicker は DBNull.Value には未対応なため、画面上は日付がセットされるかのように見えてしまいます。

    新規追加時の日付をセットしてしまって良ければ、以下のようにしてデフォルト値をセットしてください。
    ※データセットは DataSet1、テーブルは MyTable、日付項目は MyDate という名前の場合のサンプルです。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '(これは既存コードのはず)
        Me.MyTestTableAdapter.Fill(Me.DataSet1.MyTable)

        '新規追加時のイベントハンドラを設定。
        AddHandler DataSet1.MyTest.TableNewRow, AddressOf MyTest_TableNewRow
    End Sub

    Private Sub MyTest_TableNewRow(ByVal sender As Object, ByVal e As DataTableNewRowEventArgs)
        '今日の日付をデフォルト値とする。
        e.Row(DataSet1.MyTest.MyDateColumn) = DateTime.Now.Date
    End Sub

    別の方法として、値が DBNull.Value であることがわかるようにするために、DateTimePicker を改造する方法もあります。
    以下のリンクが参考になると思います。

    DateTimePickerコントロールでDBNullを扱うには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/702nullpicker/nullpicker.html

    ■DateTimePickerでNull値の表示内容について。
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45150&forum=7


    ◆TI-cb400 さん
    > 現状は「+」ボタンをクリックした際にdatatableのレコードが0件の場合には、「1」を表示するようにプログラムを書いているのですが、
    > 何も手を加えない状態では、上記の動作は仕方がないのでしょうか。

    デザイナでの TableAdapter の編集画面にて、日付項目の AutoIncrementSeed プロパティの値を 1 にすることで実現できないでしょうか?

    • 編集済み 高橋 春樹 2010年3月29日 6:05 リンクがうまく張れてなかったようなので、リンクを修正させて頂きました。
    • 回答としてマーク 高橋 春樹 2010年3月29日 6:14
    2010年3月24日 11:16

すべての返信

  • まず、DateTimePicker の件、、、
    DateTimePicker が null なのではなく
    初期値が入っていても null で更新しようとしてしまっているのだと思います。
    これがバグなのか仕様なのかは、
    残念ながらそもそも DataAdapter の仕様がわからないので判断できません。

    次に主キーの件、、、

    > レコードが1件もない場合は、まず「0」が表示され

    ↑試してみましたが「0」は表示されません。
    なにか、設定してますか?
    もっとも「0」ではなく空白が表示されるだけなので
    問題の解決には直接つながらないかもしれませんがいちおう確認です。

    以上、DataAdapter は詳しくないですがしばらく返信が無いようなので口火を切ってみました。

    2010年3月24日 9:06
  • ややこしそうな話でしたので敬遠していたのですが、調べてみました。

    ◆TI-cb400 さん
    > datetimepickerはNULLにしたくてもできないと認識をしていたのですが、違っているのでしょうか。

    新規追加行の各項目の値は DefaultValue 値になります。
    デフォルトの場合は DBNull.Value のため、今回の日付項目も DBNull.Value になっていると思います。
    ですが、DateTimePicker は DBNull.Value には未対応なため、画面上は日付がセットされるかのように見えてしまいます。

    新規追加時の日付をセットしてしまって良ければ、以下のようにしてデフォルト値をセットしてください。
    ※データセットは DataSet1、テーブルは MyTable、日付項目は MyDate という名前の場合のサンプルです。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '(これは既存コードのはず)
        Me.MyTestTableAdapter.Fill(Me.DataSet1.MyTable)

        '新規追加時のイベントハンドラを設定。
        AddHandler DataSet1.MyTest.TableNewRow, AddressOf MyTest_TableNewRow
    End Sub

    Private Sub MyTest_TableNewRow(ByVal sender As Object, ByVal e As DataTableNewRowEventArgs)
        '今日の日付をデフォルト値とする。
        e.Row(DataSet1.MyTest.MyDateColumn) = DateTime.Now.Date
    End Sub

    別の方法として、値が DBNull.Value であることがわかるようにするために、DateTimePicker を改造する方法もあります。
    以下のリンクが参考になると思います。

    DateTimePickerコントロールでDBNullを扱うには?
    http://www.atmarkit.co.jp/fdotnet/dotnettips/702nullpicker/nullpicker.html

    ■DateTimePickerでNull値の表示内容について。
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45150&forum=7


    ◆TI-cb400 さん
    > 現状は「+」ボタンをクリックした際にdatatableのレコードが0件の場合には、「1」を表示するようにプログラムを書いているのですが、
    > 何も手を加えない状態では、上記の動作は仕方がないのでしょうか。

    デザイナでの TableAdapter の編集画面にて、日付項目の AutoIncrementSeed プロパティの値を 1 にすることで実現できないでしょうか?

    • 編集済み 高橋 春樹 2010年3月29日 6:05 リンクがうまく張れてなかったようなので、リンクを修正させて頂きました。
    • 回答としてマーク 高橋 春樹 2010年3月29日 6:14
    2010年3月24日 11:16
  • こんにちは。フォーラムオペレーターの高橋春樹です。

    anningoさん、TH01さん
    いつもお世話になっております。
    アドバイスの投稿有難うございました。

    TI-cb400さん
    MSDNフォーラムのご利用有難うございます。
    anningoさんとTH01さんからアドバイスを頂いたと思うのですが、如何でしょうか?
    皆様からの投稿が、有用な情報だと思いましたので、
    一旦、回答マークを付けさせてもらいました。

    TI-cb400さんの現在の状況も気になるので、
    是非、皆様からのアドバイスに返信して頂きたいと思います。

    尚、回答マークは問題解決を意味するものではないので、その他アドバイスがありましたら
    ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年3月29日 6:15