テキストボックスとデータベース への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 るきお  (社会人)
投稿日時
2013/7/2 12:48:06
>読み込む時点でNULLだったら、アップデート後もNULLにしたいです。
Nullで更新するSQL文は次のようになります。
ですから、TextBoxの内容が空文字(長さ0の文字列)の場合、Nullで更新、そうでない場合入力されている値で更新するプログラムは次のようになります。
なお、Nullかどうか判断するところでHARUさんは、
と書かれていますが、これだと、 ToStringの戻り値がNullかどうか検査していることになりますから、
次のように書くのが正しいと思います。
もちろん【データベースの項目】の型がNullを保持できていることが前提です。
できましたら実際に使っているプログラムをそのまま貼り付けていただいた方が正確な会話ができます。
スペース含めて40文字にされてしまう件は、もちださんの言うようにcharやncharなどを使って固定長で定義しているのではないかと思います。
だとすると、Nullの話とは別にどこかでTrimしたほうがいいかも知れません。
なお、例であげたSQLは説明を簡単にするために不具合を承知でシンプルなまま載せています。
この例をそのまま使うとTextBoxに ' を入力された場合などエラーになるばかりか、データベースに不正アクセスされて情報を引き出されるかもしれません。またパフォーマンス上もあまりよくありません。解決策として実際のプログラムではパラメーター化クエリを使用されることをお奨めします。
ごく少人数が使う致命的でないシステムならこのままリリースでも許される…かもしれませんが…。
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に ' を入力された場合などエラーになるばかりか、データベースに不正アクセスされて情報を引き出されるかもしれません。またパフォーマンス上もあまりよくありません。解決策として実際のプログラムではパラメーター化クエリを使用されることをお奨めします。
ごく少人数が使う致命的でないシステムならこのままリリースでも許される…かもしれませんが…。
投稿者 もちだ  (社会人)
投稿日時
2013/7/2 12:28:04
>データベースは Microsoft Sql Server で、この項目の「長さ」が「40」になっています。
この項目が固定長になっているのでは?
固定長の場合は不足分をスペースか何かで埋めるような気が。
この項目が固定長になっているのでは?
固定長の場合は不足分をスペースか何かで埋めるような気が。
投稿者 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文字になってしまいます。
どうしたらよいのでしょうか?お知恵をお貸しください。
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文字になってしまいます。
どうしたらよいのでしょうか?お知恵をお貸しください。
おっしゃる通り、固定長(char)だった為、空白で埋まっていたようです。
ちなみにオラクルとSQLサーバーではNULLの扱いが違うんですね、
VB5.5の時はオラクルだったので上手くいっていたようでした。
NULLの件もわかりやすく説明して頂きありがとうございました。
解決できてうれしいです!