- PR -

Smalldatetime型のカラムにNULLを更新

投稿者投稿内容
オベ
会議室デビュー日: 2004/10/29
投稿数: 11
投稿日時: 2004-11-08 10:08
データセットを使ってDate型のカラムにDBNullを更新したいのですが、なかなかうまくいきません。過去記事でSystem.DBNull.Valueを使うと書いてあるのですが、型違いで怒られてしまします。プログラム歴がまだ浅いのでよろしくお願いします。

[環境]
Windows 2000 Proffessional
VB.Net
SQL Server 2000

[例]
テキストボックスの欄が無記入だった場合、もしくは記載されているのを削除した場合。DBのSmalldatetime型のカラムににNullを更新する。
-----略------------------------------

Dim du As データセット名.テーブル名Row

'データセットにデータを格納
SqlDataAdapter2.Fill(データセット名)

'変更する行を取得
du = データセット名.テーブル名.FindByプライマリーキー(**********),
form.キーの値

'制約のチェックを中断
du.BeginEdit()

**↓問題の部分↓**

'記入日が画面上で変更があった場合
*更新ボタンを押した時、フォーム呼び出し時のテキストボックスと現在のテキストボックスの中身が違う場合、更新をかける

If t_WriteDay(i).Text.CompareTo(writeDay(textBoxChk(i))) <> 0 Then
du.記入年月日 = t_WriteDay(i).Text //記入年月日はSmalldatetimeのカラム
↑テキストボックスに何も書かれていない場合は、NULLを更新したいです。
End If

'制約のチェックを再開
du.EndEdit()

'テーブルに更新する
SqlDataAdapter2.Update(データセット名.テーブル名)

------------------------------------------------

よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-08 10:22
コードに日本語表記がたくさんあってイマイチ理解できないのですが。。。
普通にコードを載せられないでしょうか?
オベ
会議室デビュー日: 2004/10/29
投稿数: 11
投稿日時: 2004-11-08 10:32
申し訳ないです。見やすくもう一度書き直します!!

-------------------------------------------

SqlDataAdapter2.Fill(G_RI_HAISI_NEWRECORD1)

du = G_RI_HAISI_NEWRECORD1.廃止管理.FindBy廃止管理ID利用者ID(haisiId(textBoxChk(i)), form.riyouInfo_RiyouId_chkRslt(0))

du.BeginEdit()

'記入日が画面上で変更があった場合
If t_WriteDay(i).Text.CompareTo(writeDay(textBoxChk(i))) <> 0 Then
du.記入年月日 = t_WriteDay(i).Text
flgUpChk = True
End If

du.EndEdit()

SqlDataAdapter2.Update(G_RI_HAISI_NEWRECORD1.廃止管理)
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-11-08 10:38
さかもとと申します。
現在エラーとなっている記述も書いていただければ。
でもベテランの方々ならこの時点で分かるかもですけど・・・(笑)
まだ他の方のエラーを見て勉強している身なので。
宜しくお願いします。
オベ
会議室デビュー日: 2004/10/29
投稿数: 11
投稿日時: 2004-11-08 10:48
エラーの内容ですが上記のソースコードの
du.記入年月日 = t_WriteDay(i).Text
の部分で、
追加情報 : 文字列 "" から型 'Date' へのキャストが有効ではありません。
とエラーがでます。

テキストボックスに何も記入がない場合の更新なのですが、空文字のString型からdate型へ更新しようとしたのでエラーになったことまでわかりました。むりやりDate型に変換して
CDate(t_WriteDay(i).Text)
のように記述してみましたが、同じエラーがでてしまいます。
空文字をなんとかDBNullで更新できないでしょうか?
初心者なもんで宜しくお願いします。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-11-08 11:15
さかもとです。
そういうことでしたか,DBnullで試した結果が駄目だったのかな?と思いまして。

if テキストボックスが空白 then
du("記入年月日") = DBNull.Value
end if

では駄目でしたか?
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-08 11:39
さかもと様の方法で可能だと思いますが、
そのテキストボックスに入力されるのは日付のフォーマットにそった文字列であることは
保証されているのでしょうか?本来なら値チェックをおこなうべきだと思います。
オベ
会議室デビュー日: 2004/10/29
投稿数: 11
投稿日時: 2004-11-08 11:42
さかもとさん返信ありがとうございます。
教えていただいたとうりにソースを記述した結果、無事にNULLを更新することができました。
ありがとうござました。
対処したソースを一応記述しておきます。

問題の部分
[修正ロジック]

'記入日が画面上で変更があった場合
If t_WriteDay(i).Text.CompareTo(writeDay(textBoxChk(i))) <> 0 Then
 'テキストボックスが無記入であるかどうか
If t_WriteDay(i).Text = "" Then
du("記入年月日") = DBNull.Value
Else
du.記入年月日 = t_WriteDay(i).Text
End If
End if

-------------------------------------------

たびたびの質問になってすみませんが、下記の違いについてわかるでしょうか?

@ du("記入年月日") = DBNull.Value
A du.記入年月日 = DBNull.Value

さかもとさんに対処法を教えていただく前に、Aの方法で記述してみたんですが、エラー(Date型にキャストできませ)がでてしまっていたので、DBNullの使い方に戸惑っていました。
@とAの違いは何なのでしょうか?
よろしくお願いします。

>burton999さんへ
特にテキストボックスの文字列に日付型の制約は入れてないのですが、なにかチェックを入れたほうがよろしいのでしょうか?

[ メッセージ編集済み 編集者: オベ 編集日時 2004-11-08 11:47 ]

スキルアップ/キャリアアップ(JOB@IT)