- - PR -
空文字列不許可のフィールドにデータをNull値にして保存したい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 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)」のデータで、
を行うと = "空文字列"?(何故、Nullでないの??) 4)でも、「3 ; ううう ; (Null) ; (Null)」のデータを、「3 ; んんん ; (Null) ; (Null)」に変えて (fldテスト1のみ変更)保存しても = 保存OK??(だって、Fldテスト2TextBox.Textは"空文字列" だよって今確認したじゃない??) 5)fldテスト3のComboBoxには、Form1_Load時
それから、Fldテスト3ComboBox_KeyDownで
しています。 (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 ] | ||||||||||||
|
投稿日時: 2007-02-09 07:02
移動中の携帯からなので簡単に
nullと 空文字列は、同じではありません。DbNullも、違うものです。TextプロパティとString.Emptyを比較してください。 _________________ | ||||||||||||
|
投稿日時: 2007-02-09 09:50
空き文字列を null にしたいなら、DataTable の空き文字列を自分で null して保存すれば良いかと。
でも、あまり良い方法じゃないですね。 _________________ R・田中一郎 - R.Tanaka.Ichiro’s Blog | ||||||||||||
|
投稿日時: 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の代入はできない。」とかで、、、) | ||||||||||||
|
投稿日時: 2007-02-09 11:55
Accessはよくわかんないけど
UPDATE - SET 列=NULL とかやってない? SET 列 IS NULL とかじゃない? _________________ | ||||||||||||
|
投稿日時: 2007-02-09 15:50
型付き DataSet は使っていないのですか? フィールドで、AllowDBNull プロパティを True にして、"" を null に置き換えてから TableAdapter で Update() してあげれば良いのだと思ったのですが。 _________________ R・田中一郎 - R.Tanaka.Ichiro’s Blog | ||||||||||||
|
投稿日時: 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()できないでしょうか? と言うのが一連の質問でした。 そんな中で試したりしたものは、
※ 上記は、Update()直前に代入です。(もちろん、.TextにDBNull.Valueの代入ですからエラーとなります。) とかでした。 Jittaさん、ありがとうございます。 Updateは、上記のような処理です。 |