テキストボックスとデータベース

タグの編集
投稿者 HARU  (社会人) 投稿日時 2013/7/2 10:42:33
はじめまして。
 VB5.5からVB2012にプログラムを移行しています。
 質問は以下の通りです。

まず、textboxにデータベースから読んだ文字列を表示しています。
NULLの場合には「””」を代入しています。

  If IsDBNull(【データベースの項目】.ToString) = False Then
      textbox1.Text = 【データベースの項目】.ToString
 Else
      textbox1.Text = ""
 End If

この時点で、textboxの表示上問題はありません。
 次にこのtextbox1.textを使ってデータベースをアップデートします。

  "update テーブル set 列名 = '" + textbox1.Text + "' where  条件"

そうすると、アップデートされたデータが、読み込んだデータがNULLだった時には
40文字の空白になっています。
 文字が入っていた場合でも、「文字+空白=40文字」になっています。
データベースは Microsoft Sql Server で、この項目の「長さ」が「40」になっています。

 読み込む時点でNULLだったら、アップデート後もNULLにしたいです。
せめて0文字の空白「””」になっていてくれたらよいのですが、
なぜか40文字になってしまいます。

どうしたらよいのでしょうか?お知恵をお貸しください。 
投稿者 もちだ  (社会人) 投稿日時 2013/7/2 12:28:04
>データベースは Microsoft Sql Server で、この項目の「長さ」が「40」になっています。
この項目が固定長になっているのでは?
固定長の場合は不足分をスペースか何かで埋めるような気が。
投稿者 るきお  (社会人) 投稿日時 2013/7/2 12:48:06
>読み込む時点でNULLだったら、アップデート後もNULLにしたいです。
Nullで更新するSQL文は次のようになります。
update テーブル set 列名 = Null where  条件


ですから、TextBoxの内容が空文字(長さ0の文字列)の場合、Nullで更新、そうでない場合入力されている値で更新するプログラムは次のようになります。
If Len(TextBox1.Text) = 0 Then
    Dim sql As String = "update テーブル set 列名 = Null where  条件"
    'SQL実行 
Else
    Dim sql As String = "update テーブル set 列名 = '" & TextBox1.Text & "' where  条件"
    'SQL実行 
End If


なお、Nullかどうか判断するところでHARUさんは、
If IsDBNull(【データベースの項目】.ToString) = False Then

と書かれていますが、これだと、 ToStringの戻り値がNullかどうか検査していることになりますから、
次のように書くのが正しいと思います。
If IsDBNull(【データベースの項目】) = False Then

もちろん【データベースの項目】の型がNullを保持できていることが前提です。

できましたら実際に使っているプログラムをそのまま貼り付けていただいた方が正確な会話ができます。

スペース含めて40文字にされてしまう件は、もちださんの言うようにcharやncharなどを使って固定長で定義しているのではないかと思います。
だとすると、Nullの話とは別にどこかでTrimしたほうがいいかも知れません。

なお、例であげたSQLは説明を簡単にするために不具合を承知でシンプルなまま載せています。
この例をそのまま使うとTextBoxに ' を入力された場合などエラーになるばかりか、データベースに不正アクセスされて情報を引き出されるかもしれません。またパフォーマンス上もあまりよくありません。解決策として実際のプログラムではパラメーター化クエリを使用されることをお奨めします。
ごく少人数が使う致命的でないシステムならこのままリリースでも許される…かもしれませんが…。
投稿者 HARU  (社会人) 投稿日時 2013/7/2 13:26:41
お二方とも、ありがとうございました!

おっしゃる通り、固定長(char)だった為、空白で埋まっていたようです。
ちなみにオラクルとSQLサーバーではNULLの扱いが違うんですね、
VB5.5の時はオラクルだったので上手くいっていたようでした。

NULLの件もわかりやすく説明して頂きありがとうございました。

解決できてうれしいです!