_variant_t型のNULLチェック

このQ&Aのポイント
  • ADOでAccess2000のテーブルを読み込む際に、空のフィールドを読み込んだときにエラーが発生します。
  • 名前が空の場合、リストビューに表示させる際にエラーが発生します。
  • フィールドが空かどうかの判断方法を教えてください。
回答を見る
  • ベストアンサー

_variant_t型のNULLチェック

ADOでAccess2000のテーブルを読み込もうとしていますが、空のフィールドを読み込んだときにエラーになります。 FieldPtr pfName; _variant_t vName; CString strwk;  :  : pfName = pRs->Fields->GetItem("名前"); vName.Clear(); vName = pfName->Value; strwk = vName.bstrVal; 名前が空の場合、このstrwkをリストビューに表示させようとするとエラーになります。 ウォッチウィンドウで見ると{VT_NULL}と表示されますが、 if (vName == VT_NULL) とすると、コンパイルで、「あいまいです」とエラーになります。 フィールドが空かどうかの判断の方法を教えてください。

  • kmor
  • お礼率90% (255/283)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

if (vName == VT_NULL) を if (vName.vt == VT_NULL) としてみたらどうでしょう?

kmor
質問者

お礼

おっしゃるとおりでした。 ウォッチウィンドウで見たらvtは1となっていたので判断に使えないと思っていました。 ありがとうございました。

関連するQ&A

  • Accessで値がnullの場合は計算せずにnullをかえす方法

    Accessについて、教えてください。 クエリで抽出しているときに、フィールド1とフィールド2の数値を掛け算した値をフィールド3に表示したいと思っています。(小数点1位まで表示) フィールド1とフィールド2は値がnullの場合もありますが、この場合は「0」として扱うのではなく、そのまま計算結果もnullにしたいと思っています。 最初は単純に フィールド3: ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1) とクエリに表記したのですが、この場合「フィールド1」や「フィールド2」がnullの場合は#ERRORが表示されました。 次に、IFでフィールド1やフィールド2がnullの場合は計算せずにnullをかえしてもらおうと下記のような文をつくりました。 フィールド3: IIf([フィールド1]=Null,Null,IIf([フィールド2]=Null,Null,ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1))) これでもやっぱり#ERRORが表示されます。 いろいろと検索したのですが、nullを0として扱う例は多数見つけられましたがnullのまま扱う例が見つけられませんでした。 勘違いしているところがあるかもしれませんが、アドバイスよろしくお願いいたします。

  • ADOでNullフィールドの抽出

    VB6.0+ADO2.7で、mdbファイルを扱っています。 .filterプロパティを使ってabcフィールドの値がnullまたは空のテーブルを抽出したく recordset.filter="abc= null or abc=''" としました。この場合は問題ないのですが、更にdefフィールドの条件を追加し recordset.filter="(abc= null or abc='') AND def= 'xyz'" としたところ 「実行時エラー3001 引数が間違った型、許容範囲外、または競合しています。」 というエラーが発生してしまいます。 また、 recordset.filter="abc= null AND def= 'xyz'" 或いは recordset.filter="abc='' AND def= 'xyz'" では問題ありません。 何が悪いのでしょうか? よろしくお願いします。

  • アクセス ADO Null以外のレコードの件数を取得したい

    アクセス ADO Null以外のレコードの件数を取得したい テーブルにレコードが100行あり、そのうちNull値は40行あります。(主キーではないです) この時、ADOでNull以外にフィルタをかけたいのですが For i = 1 To RS.RecordCount RS.Filter = "フィールド = '*'" でも RS.Filter = "フィールド = 'Null''" でも、文字列になってしまい、うまくいきません。 RS.Filter = "フィールド " <> 'Null' だとエラーになります。 「<>null」を抽出する方法をご教授願います。

  • ADOでNULLのレコードを抽出したい

    ADOでNULLのレコードを抽出したいのですがうまくできません。 Q全てクエリには、登録日フィールドや登録数フィールドがあります。 登録数フィールドは数値です。 その登録数フィールドがnullのレコードを抽出したいです。 RS.CursorLocation = adUseClient RS.Open "Q全て", cn, adOpenKeyset, adLockOptimistic RS.Sort = "登録日 DESC" RS.Filter = "[登録数] = NULL" RS.Filter = "IsNull(登録数) = True" RS.Filter = "登録数 Is Null" ↑これどれをやってもエラーになります。 対策をお願いします。

  • NULLを含むフィールド値の条件分岐

    どなたかご存知の方はご教示願います。 使用言語はVB6_SP5、DBはMdb(アクセス97形式)です。 ADOでDBに接続し、レコードセットを取得しそのレコードの任意のフィールドの値により処理を3通りに分けたいのです。(値はNULL、"1"、"9" の3つです。) IF文で条件分岐を行いたいのですが、うまく振り分けができずにおります。 IF ISNULL(RS.FIELDS("HHH").VALUE) THEN NULLの場合の処理 ELSE "1"の場合の処理 END IF ' "9" の場合はなにもしない 結果は全てNULLの場合の処理を実行してしまいます。 どこを修正すれば宜しいのでしょうか?

  • チェックボックスの値を新規でレコードへ格納したい(Access2003 ADO)

    宜しくお願いします。 Access2003(WinXP)です。ADOで書いています。 テーブルへ新しいレコードを作成していれる時と 既にあるレコードへの編集なのですが、 新規の時は AddNew を書くだけで 他は同じコードを利用しています。 テキストボックスやコンボボックスの値は入るのですが チェックボックスのTrue、Falseのところで 新規の時だけエラーになります。 編集の時は大丈夫です。 rs.Fields("フィールド名").Value = Form.チェックボックス名.Value と入れているのですが、いけないのでしょうか。 ちなみにDAOで書いていたのを途中でADOに変えています。 rs.Fields!フィールド名= としてもだめでした。 分かる方、お願いします。

  • accessで null値のあるデータを追加したい

    もとエクセルのデータで、フィールドにnullのところがあるデータをアクセスに追加したいのですが、 エクセルをアクセスにインポートはできるんですが、 それを追加しようとすると、 追加クエリでエラーが出ます。 どうすればいいのでしょうか? そのフィールドはインデックスはつけてません。 空文字列を はい にしてもだめでした。 access2000 windows2000

  • スプレッドシートのnull表示

    win2000、vb6.0、スレッドシート3.0(文化オリエント)を使用しています。 1レコードの中から特定のフィールドだけスプレッドシートに表示し、更新できるようにしたいと考えています。 'ここまでで、レコードセットrsに1レコードセット。 Set SPR_Test.DataSource = rs SPR_TEST.col = 1 SPR_TEST.DataField = "data1" SPR_TEST.col = 2 SPR_TEST.DataField = "data2 ※上記でスプレッドシートにDBから数値型のデータを読み込んで表示しているのですが、nullのレコードが 0 で表示されています。 回避する為に、 SPR_TEST.col = 1 If IsNull(rs.Fields("data1")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data1" End If SPR_TEST.col = 2 If IsNull(rs.Fields("data2")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data2" End If と変更したのですが、今度はdata1,data2共にNullの場合、全くフィールドを指定していないので、他のフィールド全部表示してしまいます。 Nullは空白のまま表示したいのですが、方法はあるのでしょうか?

  • ADOでエクセルを読む時にフィールドを序数でアクセスしたい

    開発環境はVC++.Net Office2000 SDK開発  お世話になります。 ExcelをADOを使い中身を見ようとしているのですが、 フィールド名が無いので序数でフィールドにアクセスしようとしていますが 「要求された名前、または序数に対応する項目がコレクションで見つかりません」 とエラーが出てしまいます。 GetItemに序数を入れているつもりなのですがうまく行きません。 ただ、列名を入れればアクセスできるので、序数の指定以外は問題ないと思っています。 プログラムは以下のようにしていますが、何か解決の糸口はありませんか? TESTHRxls(lpRecordset.CreateInstance(__uuidof(Recordset))); TESTHRxls(lpRecordset->Open(bsCommand,bsConn,adOpenDynamic,adLockPessimistic,adCmdText)); lpRecordset->MoveFirst();//先頭へ移動 while(!(lpRecordset->EndOfFile)){ vIndex=1; _bstr_t testValue = lpRecordset->Fields->Count; int testValue2 = lpRecordset->Fields->GetItem(vIndex)->Value; lpRecordset->MoveNext(); }//--while(!(lpRecordset->EndOfFile)){ lpRecordset->Close();

  • int型フィールドにnullを登録できない・・・

    > insert into tbl_tst values (001,'',21000,,22,4400,'3~4日','∞') とすると syntax error になってしまいます。 > insert into tbl_tst values (001,'',21000,'',22,4400,'3~4日','∞') とすると out of range になってしまいます。 > insert into tbl_tst values (001,'',21000,0,22,4400,'3~4日','∞') は通常に登録できます。 > insert into tbl_tst values (001,'',21000,'0',22,4400,'3~4日','∞') も通常に登録できます。 4カラム目のフィールドなのですが、show fields で見ても int(11) Null→YES  Default→NULLとなっております。 NULLを登録(何も値を入れない)したいのですが、 どうすればよいでしょうか。 ご存知の方いらっしゃいましたらご教示願います。 宜しくお願い致します。

    • ベストアンサー
    • MySQL

専門家に質問してみよう