- PR -

空文字列不許可のフィールドにデータをNull値にして保存したい

投稿者投稿内容
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2007-02-09 00:50
saki1208です。

なるほど。

Textプロパティの話をされているので、たとえば"テキスト0.Text = Null"等
と比較されていると思い込んでいましたが、"テキスト0 = Null"で試された
のでしょうか?
(読み返すとそのように書いてありますねぇ)

VBA(この場合Access上での話ですが)で後者の記述をすると、デフォルトプロ
パティで設定されますので、「Value」プロパティに設定することになります。

前者では、明示的に「Text」プロパティに設定していますのでエラーとなり
ます。
(なぜかについては、オブジェクトブラウザやウォッチウィンドウでプロパ
ティの型を確認すればすぐにわかります。)

「Text」プロパティがない?>私の手元にあるAccessのフォームには存在し
ていますよ。

追記:
Accessのテキストボックスは、DB操作前提なのでTextプロパティだけでは不
十分なため、Valueプロパティが用意されているのではなかったかなぁ...


[ メッセージ編集済み 編集者: saki1208 編集日時 2007-02-09 01:07 ]
goo〜glen
会議室デビュー日: 2007/02/04
投稿数: 14
投稿日時: 2007-02-09 02:17
皆様、こんばんは。お世話になってます。

長くなりますが、最小単位でテストした結果を書込んでみます。

Accessの構成は、
[テーブル]
tblテスト
[フィールド] : データ型
fldテストID(主キー) : オートナンバー型
fldテスト1 : テキスト型(空文字列の許可=はい)(値要求=いいえ ※Nullを許可)
fldテスト2 : テキスト型(空文字列の許可=いいえ)(値要求=いいえ ※Nullを許可)
fldテスト3 : テキスト型(空文字列の許可=いいえ)(値要求=いいえ ※Nullを許可)
[テストデータ] 3件
fldテストID ; fldテスト1 ; fldテスト2 ; fldテスト3
1 ; あああ ; AAA ; aaa
2 ; いいい ; III ; (Null)
3 ; ううう ; (Null) ; (Null)

VB2005で、WindowsFormです。
データソース構成ウィザードでデータセットを作成し、データソースウィンドウからデータテーブルを
フォームにドラッグしてコントロールを配置しました。
※ なお、TextBox等のクリアは、Deleteキーで消しています。

■ 詳細で配置(「fldテストID」〜「fldテスト2」は、TextBox。「fldテスト3」は、ComboBox。)
1)fldテスト1(「あああ」など)をクリア = 保存OK
2)fldテスト2(「AAA」など)をクリア = 保存エラー
3)「3 ; ううう ; (Null) ; (Null)」のデータで、
コード:

If IsDBNull(Me.Fldテスト2TextBox.Text) Then
MessageBox.Show("Null")
ElseIf Me.Fldテスト2TextBox.Text = String.Empty Then
'ElseIf Me.Fldテスト2TextBox.Text = "" Then 'これでも同じ
MessageBox.Show("空文字列")
End If


を行うと = "空文字列"?(何故、Nullでないの??)
4)でも、「3 ; ううう ; (Null) ; (Null)」のデータを、「3 ; んんん ; (Null) ; (Null)」に変えて
(fldテスト1のみ変更)保存しても = 保存OK??(だって、Fldテスト2TextBox.Textは"空文字列"
だよって今確認したじゃない??)
5)fldテスト3のComboBoxには、Form1_Load時
コード:

Me.Fldテスト3ComboBox.Items.Add("aaa")
Me.Fldテスト3ComboBox.Items.Add("bbb")


それから、Fldテスト3ComboBox_KeyDownで
コード:

If e.KeyCode = Keys.Delete Then
'Me.Fldテスト3ComboBox.SelectedValue = DBNull.Value
Me.Fldテスト3ComboBox.SelectedIndex = -1
End If


しています。
(ComboBoxは、DropDownStyleをDropDownListにしているため)
で、うっかり"aaa"なんかを選択して、すぐにDeleteでクリアしても = 保存エラー

■ DataGridViewで配置
1)fldテスト2(「AAA」など)をクリア = 保存OKでした。(最初の書込み訂正します。)
でも何故??


Accessで「空文字列の許可」をしていないのだから仕方ないのかも知れませんが、現行のAccess
システムで Null 検索を多用しているので、Access側の変更なしで行けないものかと考えております。

-------------------------------------------------------------------------------
saki1208さん、夜分遅くご返事ありがとうございます。

> Textプロパティの話をされているので、たとえば"テキスト0.Text = Null"等
> と比較されていると思い込んでいましたが、"テキスト0 = Null"で試された
> のでしょうか?
> (読み返すとそのように書いてありますねぇ)
はい。その通り、"テキスト0 = Null"で試しました。

> 「Text」プロパティがない?>私の手元にあるAccessのフォームには存在し
> ていますよ。
失礼しました。勘違いでした。
よく変更時イベント等で、「Text」プロパティのお世話になっておりました。

[ メッセージ編集済み 編集者: goo〜glen 編集日時 2007-02-09 02:30 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-09 07:02
移動中の携帯からなので簡単に


nullと 空文字列は、同じではありません。DbNullも、違うものです。TextプロパティとString.Emptyを比較してください。
_________________
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-02-09 09:50
空き文字列を null にしたいなら、DataTable の空き文字列を自分で null して保存すれば良いかと。

でも、あまり良い方法じゃないですね。

_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
goo〜glen
会議室デビュー日: 2007/02/04
投稿数: 14
投稿日時: 2007-02-09 11:09
Jittaさん、ご返事ありがとうございます。

> nullと 空文字列は、同じではありません。DbNullも、違うものです。TextプロパティとString.Emptyを比較してください。

Nullと空文字列の違いはおおむね理解しているつもりです。
(「おおむね理解している」と言うことが、不十分と言われそうですが・・・)

データベース(Access限定かもしれませんが?)のフィールド(コントロール)で、見た目の
データがない状態と言うのは、私なりには次の3つと理解していました。
1)Null = 主キーなどの項目にデータが入力され、レコードは成立しているが、データの
ない項目(フィールド)の状態。(規定値が設定されていないフィールドの初期値)
2)空文字列 = 文字通り(長さ 0 の文字列)が設定されている状態。
3)1つ以上のスペースのみが入力されている状態。(これは論外ですね。)

で、Accessの場合、テキスト型フィールドの規定値は、「空文字列の許可=いいえ」「値要求=
いいえ ※Nullを許可」となるのですが、この場合このフィールドには「Null」または
「スペース等の文字列」しか存在しないので、「Null集まれ」や「Nullでないもの集まれ」で
抽出可能です。
これが、「空文字列の許可=はい」とすると、フィールドの規定値に「長さ 0 の文字列」を
設定するか、合わせて「Nullを許可しない」にするとかの対処が必要だと理解していました。
(同じく抽出では、「Null Or xxx.Text = "" (Accessでは、xxx.Value = "" )集まれ」が必要。)

また、「Null(VB6・VBA)は、VB2005ではNothing(オブジェクト)とDbNull(データベース)に」?
(「なっちゃんのプログラミングTips」だったかな?)また、msdnで良く見る「値が null 参照
(Visual Basic では Nothing) である場合に・・・」なんて、読んでもチンプンカンプンなんですが、
データベースにおいては、「NullとDbNull(.Value)は、ほぼ同義語」と考えていたのですが、
この辺りも間違いなんでしょうか?

さらに、Textプロパティは、String型(クラス?)なので、Nullの代入はできない。
String.Emptyも、長さ 0 の文字列 "" 、、String型(クラス?)なのでTextプロパティに代入可。。。

この辺りの参考となる書籍、サイト当をご紹介いただければ助かります。
(虫が良すぎる話ですが、できるだけ初心者向けの内容で、、、)


田中一郎さん、ご返事ありがとうございます。

> 空き文字列を null にしたいなら、DataTable の空き文字列を自分で null して保存すれば良いかと。

> でも、あまり良い方法じゃないですね。

ご指摘の通り(だと思うのですが)、結果としては、空き文字列(と思われる状態のもの)を
Null保存したいのです。
でも、その方法が分からない状況です。
(「Textプロパティは、String型(クラス?)なので、Nullの代入はできない。」とかで、、、)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-09 11:55
Accessはよくわかんないけど
UPDATE - SET 列=NULL
とかやってない?
SET 列 IS NULL
とかじゃない?
_________________
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2007-02-09 15:50
引用:

goo〜glenさんの書き込み (2007-02-09 11:09) より:

ご指摘の通り(だと思うのですが)、結果としては、空き文字列(と思われる状態のもの)を
Null保存したいのです。
でも、その方法が分からない状況です。
(「Textプロパティは、String型(クラス?)なので、Nullの代入はできない。」とかで、、、)


型付き DataSet は使っていないのですか?
フィールドで、AllowDBNull プロパティを True にして、"" を null に置き換えてから TableAdapter で Update() してあげれば良いのだと思ったのですが。
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
goo〜glen
会議室デビュー日: 2007/02/04
投稿数: 14
投稿日時: 2007-02-09 17:09
お世話になっております。

R・田中一郎さん、ありがとうございます。

> 型付き DataSet は使っていないのですか?
> フィールドで、AllowDBNull プロパティを True にして、"" を null に置き換えてから TableAdapter で Update() してあげれば良いのだと思ったのですが。

データソース構成ウィザードで作成したDataSetですので、型付き(型指定された)DataSetです。
また、夜中にテストした簡易版も型付き(型指定された)DataSetです。
そして、そのDataTableのフィールドのAllowDBNullプロパティもTrueで、
TableAdapterでUpdate()した時のエラーが、「フィールド 'xxx' には、長さ 0 の文字列を格納できません。」
なのです。

ただ、そのエラーの対象となるAccessのフィールドが、「空文字列の許可=いいえ」、「値要求=いいえ(※ Nullを許可)」
なので、当たり前のエラーだと言われればそれまでなのですが、
VB2005のWindowsFormで読込んだデータの修正が、結果的に入力を取り止める修正(クリア)だった場合でも、
エラーを回避してTableAdapterでUpdate()できないものかと考えていた所です。

そして、その方法の一つとして、仮に
”WindowsForm上でクリアしたデータ(フィールド)は、「長さ 0 の文字列」となる。”
のであれば、Nullに置き換えてからUpdate()できないでしょうか?
と言うのが一連の質問でした。

そんな中で試したりしたものは、
コード:
    Private Sub TblテストBindingNavigatorSaveItem_Click(ByVal ・・・
        If Me.Fldテスト2TextBox.Text = "" Then
            Me.Fldテスト2TextBox.Text = DBNull.Value
        End If

        Me.Validate()
        Me.TblテストBindingSource.EndEdit()
        Me.TblテストTableAdapter.Update(Me.TestDataSet.tblテスト)
    End Sub


※ 上記は、Update()直前に代入です。(もちろん、.TextにDBNull.Valueの代入ですからエラーとなります。)
とかでした。



Jittaさん、ありがとうございます。

Updateは、上記のような処理です。

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