VB6.0のADO-Access-Symfoware連携において、
ADOのフィールドプロパティType
(rs(field).Typeのように記述)を用いて、
CHAR、NCHAR VARYING、VARCHAR属性の
各フィールドについて、属性情報を
取得しようとすると以下の値が取得されます。
属性:Typeで取得した値
CHAR:adVarWChar
NCHAR VARYING:adVarWChar
VARCHAR:adVarWChar
同じ値を取得してしまうことから
上記3つの属性の区別がつきません。
これら3つの属性を区別(判断)する方法は
ないのでしょうか。
ご教授願います。
Symfoware というのは始めて聞きましたが…なるほど、富士通の DB ですか。
> VB6.0のADO-Access-Symfoware連携において、
Access 経由(外部テーブル接続?)でなければいけないのでしょうか。
直接、ADO - Symfoware で繋いだ場合も、同様の結果になりますか?
たとえば、Jet 自体は CHAR 型をサポートしていますが、Access のリンクテーブル等では、
それが可変長文字列型にマッピングされたりしますし、ODBC ドライバでの接続にしても、
提供ベンダやバージョン等によって、末尾の空白を削るもの/補完するものなど、区々ですので。
> CHAR:adVarWChar
> NCHAR VARYING:adVarWChar
> VARCHAR:adVarWChar
adChar や adWChar が得られないとすれば、それは ADO 側の問題ではなく、
ODBC ドライバあるいは OLE DB プロバイダの制限という可能性が高いかと。
別のドライバが提供されていないか、メーカーに問い合わせてみては如何でしょう。
あるいは、Oracle でいう USER_TAB_COLUMNS 表や、SQL Server でいうところの
sys.all_columns カタログビューに相当する機能が無いか調査してみるとか。
魔界の仮面弁士さん、お返事ありがとうございます。
> Access 経由(外部テーブル接続?)でなければいけないのでしょうか。
Access経由でなくても問題ありません。
過去にODBC接続で、直接Symfowareに繋いだ場合、rs(field).Typeの値が
NCHAR VARYINGの場合"18"、VARCHARの場合"10"のように属性により
違う値が得られたのですが、Windows2003 Server上で実行すると、
ODBC接続が接続エラーになったため、記述を変更し、ADO接続でフィールド
の属性を取得したかった経緯があります。
> 直接、ADO - Symfoware で繋いだ場合も、同様の結果になりますか?
勉強不足で申し訳ありません。
直接、ADO - Symfoware等のRDBを繋ぐ場合の記述が分からないのです。
簡単な記述で結構なので、サンプルソース等ございましたら、教えて
いただけたらうれしいです。
> 別のドライバが提供されていないか、メーカーに問い合わせてみては如何
> でしょう。
> あるいは、Oracle でいう USER_TAB_COLUMNS 表や、SQL Server でいう
> ところのsys.all_columns カタログビューに相当する機能が無いか調査
> してみるとか。
上記のような機能があるのかどうか調査してみます。
ありがとうございます。
> ODBC接続が接続エラーになったため、
あれ? Access 経由で接続するなら、結局は ODBC 経由になるのでは。
Jet 自身が直接サポートしている外部データベースには、確か
dBase, Excel, HTML, Lotus 1-2-3, Exchange, Outlook, Paradox, Text 等が
あったと思いますが、Symfoware は対象外かと思いますので、Access 経由なら、
案1) ODBC パススルークエリ接続
案2) ODBCDirect モード接続
案3) ODBC リンクテーブル接続
のいずれかということになり、いずれにしても ODBC は必要な気がしますが…。
> 直接、ADO - Symfoware 等のRDBを繋ぐ場合の記述が分からないのです。
> 簡単な記述で結構なので、サンプルソース等ございましたら、
えぇと、私自身は所詮
>> Symfoware というのは始めて聞きましたが…
という程度の知識なので知るべくもありません。他の人に期待。(^^;
# 残念ながら、ConnectionString.com にも情報がありませんでしたし。
# http://www.connectionstrings.com/
> 教えていただけたらうれしいです。
大まかにいえば、接続文字列で
Provider=Microsoft.JET.OLEDB.4.0
を使う代わりに、
Provider=MSDASQL
を使う点が最大の違いかと思います。
とりあえず、「拡張子 udl の 0バイトのファイル」を作り、
それをダブルクリックして、ODBC 接続を行わせることはできますか?
もしそれができるなら、ADO からは
con.Open "File Name=c:\test.udl"
のようにして接続できるかと思います。
>> あるいは、Oracle でいう USER_TAB_COLUMNS 表や、SQL Server でいう
>> ところのsys.all_columns カタログビューに相当する機能が無いか調査
>> してみるとか。
> 上記のような機能があるのかどうか調査してみます。
どうやら「rdbii_column」を SELECT 〜 FROM すれば列定義がとれるようです。
CHAR なフィールドの型情報を取得することができるのかまではわかりませんが。
魔界の仮面弁士さん、度重なるお返事、大変ありがとうございます。
> Jet 自身が直接サポートしている外部データベースには、
> 確かdBase, Excel, HTML, Lotus 1-2-3, Exchange, Outlook,
> Paradox, Text 等があったと思いますが、Symfoware は対象外
> かと思いますので、Access 経由なら、
> 案1) ODBC パススルークエリ接続
> 案2) ODBCDirect モード接続
> 案3) ODBC リンクテーブル接続
> のいずれかということになり、いずれにしても ODBC は
> 必要な気がしますが…。
毎度毎度、勉強不足ですみません…。
ADO接続とODBC接続は別ものだと勘違いしておりました。
> 大まかにいえば、接続文字列で
> Provider=Microsoft.JET.OLEDB.4.0
> を使う代わりに、
> Provider=MSDASQL
> を使う点が最大の違いかと思います。
なるほど、そのような記述方法があるのですね。
> どうやら「rdbii_column」を SELECT 〜 FROM すれば列定義が
> とれるようです。
> CHAR なフィールドの型情報を取得することができるのかまでは
> わかりませんが。
ODBC直接接続は、現在の私には少々ハードルが高いようなので、
上記の『SELECT 〜 FROM』で列定義を取得することにより対応したい
と思います。
改めて、ありがとうございました。