Q&A掲示板
今日の新規投稿数:0 | 今日の返信投稿数:1 | 昨日の新規投稿数:0 | 昨日の返信投稿数:0

トップ - 前に戻る(B)
記事一覧表示モード
ツリー表示モード
タイトル一覧表示モード
テキスト取得モード
Myカスタマイズ
RSS2.0
■現在の記録記事数:14560件
[ 掲示板内検索(S) ]


検索条件: and or
検索ワードをハイライトする
[ サイト内検索 ]
カスタム検索







#5200 【質問】 ADOにおけるFieldサイズについて  田島  2004-10-19(火) 09:33返信
     #5206 【回答】 Re#5200:ADOにおけるFieldサイズについて  魔界の仮面弁士  2004-10-19(火) 11:04返信
          #5221 【質問】 Re#5206:ADOにおけるFieldサイズについて  田島  2004-10-19(火) 14:22返信
               #5240 【回答】 −−投稿者削除−−  削除済み  2004-10-19(火) 17:482004-10-19(火) 17:58
               #5241 【回答】 Re#5221:ADOにおけるFieldサイズについて  魔界の仮面弁士  2004-10-19(火) 17:59返信
                    #5258 【お礼・結果報告】 Re#5241:ADOにおけるFieldサイズについて  田島  2004-10-20(水) 08:54返信



#5200 【質問】

   ADOにおけるFieldサイズについて

    田島   2004-10-19(火) 09:33
いつもお世話になっております。

ADOを使ってレコードセットを新規に作成し、フィールドを定義する際、
タイプをadLongVarWCharにした場合にDefineSizeを指定しないと
「引数が間違った型、許容範囲外、または競合しています」
というエラーが発生します。
たとえば以下のようなコード。

Set recTest = New ADODB.Recordset
recTest.Fields.Append "Notes", adLongVarWChar

この2行目を
recTest.Fields.Append "Notes", adLongVarWChar, 536870910
とするとエラーが発生しません。ちなみに536870910という数字はAccessで作成した
テーブルを調べた数字です。
また試しに -1 を指定してもエラーが発生しません。

エラー自体は解決できたものの、これらの数字が持つ意味が気になっています。
どなたかご存知内でしょうか。


#5206 【回答】

   Re#5200:ADOにおけるFieldサイズについて

    魔界の仮面弁士   2004-10-19(火) 11:04
> タイプをadLongVarWCharにした場合にDefineSizeを指定しないと
DefinedSize、ですよね。


> 「引数が間違った型、許容範囲外、または競合しています」
> というエラーが発生します。

仕様です。

VarChar系のテキストフィールドには、データ長の指定が要求されますので、
『必要となるデータの最大長』を、DefinedSize として指定するようにしてください。

この時に指定する単位は、adLongVarWCharなどの"W系"では、 Unicode文字列の「文字数」、
Wが付かない物は、規定のコードページ(Shift_JIS)での「文字列のバイト数」です。


もし、最大長が不明の場合には、adBSTR を指定することもできます。
adBSTR は、Visual Basic の文字列型(BSTR型)と同一の型であり、これは
最大長の指定を必要としない、Unicode対応の文字列型フィールドとなります。

(ただし adBSTR の場合、ADOクライアントカーソルのOptimizeがSort機構が使えなくなります



> とするとエラーが発生しません。ちなみに536870910という数字はAccessで作成した

mdb ファイルにおいて、フィールドの DefinedSize プロパティを調べた場合、
Jet 4.0 の MEMO型は、  536,870,910 (=&H1FFFFFFE) を返し、そして
ハイパーリンク 型は、1,073,741,823 (=&H3FFFFFFF) を返します。

ただ、MEMO 型については、本来は 65,536 文字が上限サイズとなっています。
そのため、これらのJet フィールド(OLEオブジェクト型も含む) においては、
DefinedSize 値は、「サイズ上限」という意味を失っています。注意してください。


ちなみに、DefinedSize が本来の値を返さない例としては、他にも
『Microsoft OLE DB Provider for AS/400』などがあります。
(といっても、AS/400プロバイダについては、Service Packで修正済みですが)


#5221 【質問】

   Re#5206:ADOにおけるFieldサイズについて

    田島   2004-10-19(火) 14:22
魔界の仮面弁士様

早速のご回答ありがとうございます。
質問する前に何時間もかけていろいろな文書を探したつもりでいたのに見つからず、
それをまさに適切なご回答いただき、感謝と感服の気持でいっぱいです。

DefinedSize が省略できるかどうかはタイプに依存する、ということですね。
ADOのリファレンスには「省略可能です」とだけで、たった一言でも注意書きがあれば
数時間を無駄にせず済んだのにと、不親切だと思ってしまいました。

ところで、恐縮ですがさらに質問があります。

まず可変長の adBSTR についてですが、質問した後に見つけた文書に、フィールド追加の際は
adBSTR ではなく adVarChar を指定せよとありました。
http://support.microsoft.com/default.aspx?scid=kb;ja;412673
これは、Null終端テキストの違いだけで、実質同じタイプと考えても良いのでしょうか。

それから、メモ型のフィールド最大長についても、記述を見つけました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/oledb/htm/oledbprovjet_data_type_support.asp
これは、ADO、Jet 4.0を介してのみメモ型を扱うときの最大サイズは536870910になる、
と解釈しても良いのでしょうか。

ご教授のほど、よろしくお願いいたします。


#5241 【回答】

   Re#5221:ADOにおけるFieldサイズについて

    魔界の仮面弁士   2004-10-19(火) 17:59
> DefinedSize が省略できるかどうかはタイプに依存する、ということですね。
そういう事になりますね。

ADO は、OleDb を利用するためのコンポーネントというだけであり、実際の動作は、
OLE DB プロバイダの実装や、接続先のデータベース側の仕様に依存する部分が大きいのです。

なので、調査する時には ADO のリファレンス以外にも目を向けると、世界が広がるかも。


> たった一言でも注意書きがあれば

今回のデータ型の件に関しては、MDAC SDK 内の「OLE DB Programmer's Reference」にて、
  [Part 1: Introduction to OLE DB] - [Chapter 13: Data Types in OLE DB]
  [Part 5: Appendixes] - [Appendix A: Data Types]
あたりに解説がありますので、興味があれば、こちらも参照してください。


> まず可変長の adBSTR についてですが、質問した後に見つけた文書に、フィールド追加の際は
> adBSTR ではなく adVarChar を指定せよとありました。
> http://support.microsoft.com/default.aspx?scid=kb;ja;412673
記事を良く読むと、
『SQL Server や Access データベースで使用する ADO Recordset オブジェクト』と
書かれていたと思いますが、これら SQL Server や Jet では、adBSTR型のフィールドを
サポートしていなかったはずです。

なので、データシェイプで Jetへの接続に対して SHAPE APPEND する場合や、
SQL Server への接続でストアドプロシージャと結果をやりとりする場合などには、
adBSTR よりも、adVarWChar/adVarChar を利用するべきかと思います。


ついでに書くと、その記事の中には、
》 SQL Server や Access データベースからデータを読み取る場合は、ADO では
》 adVarChar 型が使用されます。
という記述がありますが、正確にいえば、Microsoft Jet においては、
  Jet 3.5x のテキストフィールドは、  adVarChar  に相当。
  Jet 4.0  のテキストフィールドは、  adWVarChar に相当。
  Jet 3.5x の固定長テキストフィールドは、adChar に相当。
  Jet 4.0  の固定長テキストフィールドは、adWCharに相当。
のようになっています。
(ただし、Jetの固定長テキスト型は、Accessではサポートされていません)


> これは、Null終端テキストの違いだけで、実質同じタイプと考えても良いのでしょうか。
いずれも Unicode Text を格納できますが、サイズの管理方法に違いがあります。

adVarWChar では、フィールド毎に「データの最大長」が決められています。
これは、SQL Server の NVARCHAR型 や Jet 4.0 の TEXT型に相当する型と言えます。
(具体的なマッピングは、OLE DB Programmer's Reference の 第13章を参照の事)

一方の adBSTR は、先にも書いたように、 BSTR型に相当しています。
つまり、VBの可変長文字列型と同様、最初にデータの長さが決定される事は
ありません。また、その長さはデータ毎に不定です。


たとえば、Jet データベース上に 『 CREATE TABLE TABLE1 (FIELD1 TEXT(30)); 』
のようにして作成されたテーブルは、『DefinedSize = 30 な adVarWChar 型』を
持った Recordset に相当しています。

そして、このような Recordset のフィールドには、31文字以上のデータを格納する事は
できません。しかし、adBSTR で定義されていれば、31文字以上でも格納できます。

というよりも、BSTRでは最大サイズを指定できません。(DefinedSizeの指定は無効となります)


なお、BSTR のメモリ構造については、VB6 のヘルプの
  [Visual Basic ドキュメント]
   +[Visual Basic の使用方法]
     +[コンポーネント ツール ガイド]
       +[DLL および Windows API へのアクセス]
         +[DLL プロシージャへの文字列の引き渡し]
の項を参照してください。


> それから、メモ型のフィールド最大長についても、記述を見つけました。
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/oledb/htm/oledbprovjet_data_type_support.asp
> これは、ADO、Jet 4.0を介してのみメモ型を扱うときの最大サイズは536870910になる、
> と解釈しても良いのでしょうか。

Jetのリファレンスを確認していないので、Jet 4.0 MEMO型の最大サイズの
仕様については、まだわかりませんが、当方で実験した限りでは、MEMO型に
少なくとも 10,485,760文字(.ActualSize = 20,971,520 バイト)のデータを、
格納できることが確認できました。(^-^;)

ただし、それを Access で開く事はできないようです。(メモリ不足エラーになります)


という事で、おそらく MEMO型の制限は、
 『Jet自身の仕様では、536,870,910文字 ( = 512×1024×1024 − 2 文字)である。』
 『ただし Access の UI では、65,536 文字 ( = 64×1024 文字) という上限がある。』
という事なのだと思います。


#5258 【お礼・結果報告】

   Re#5241:ADOにおけるFieldサイズについて

    田島   2004-10-20(水) 08:54
魔界の仮面弁士様

とても適切かつ配慮の行き渡ったご回答いただき、本当にありがとうございます。
まさしく、疑問だった仕様関係をズバリ、さらに、そこから派生する疑問までもカバーしていただいた
ことには、本当に深く感謝いたします。
また情報の場所まで教えていただき、今後にも大変役に立ちます。

今回やろうとしているのはAccessに依存しないものなので、最大536,870,910を指定して問題なさそう
です。データベースがメインのアプリというわけでなく、単にリストを整理して表示するだけの部分で
壁に当たってしまっていました。やはり手軽にちょっと使おうとするとデータベースは何かとあるもの
なのですね…。なにしろMSの文書の迷宮に迷い込んで、疑問解決の答えを探している途中で、見つけた
文書を読んでさらに新しい疑問2が生まれ、疑問2-A、疑問3-C-イ…、という具合でして…。
ひとえに勉強不足と言うことなのですが(苦笑)。

おかげ様で今回の問題は解決できました。
重ねてお礼申し上げます。
ありがとうございました。

■現在の記録記事数:14560件
[ 掲示板内記事検索 ]

検索条件: and or
検索ワードをハイライトする
[ 未読ポイント設定 ]
現在、「未読読み機能」は無効になっています。
「未読読み機能」を有効にし、未読ポイントを設定するとその記事より新しい記事のみ表示することができます。
Myカスタマイズで有効にできます。
[ 記事削除 ]
●記事番号 :
●削除用パスワード :



トップ - 前に戻る(B)

THE lg-Board REVOLUTIONS
Copyright© 2004-2010 リトルグレイ