Recordset(ADO)から列名を取得するには?


rocky  2004-01-14 13:06:48  No: 53032  IP: [192.*.*.*]

ご存知のかたご教授ください。
_RecordsetPtr pRs = pAdoConnection->Execute(
                    "select * from emp", NULL, adOptionUnspecified);

で取ったレコードセットに含まれる「列名」を取るには、

pRs->Fields->GetItem(&idx)->GetName();

で取れますが、これは通常、
while (!pRs->adoEOF) {
と、「行があれば」という条件がつきます。(idx=-1だとError)

行がなくても「列名」を取るには何を呼べばいいのでしょうか?

by VC++6 MFC #import msado15.dll

編集 削除
岡田 之仁  2004-01-16 12:54:40  No: 53033  IP: [192.*.*.*]

う〜ん・・・

SQL Serverですか?
ACCESSですか?

●  SQL Server なら・・・
    私が、過去DB構造をレポートさせるのに使ったSQLで
    構造(全てではない)が取れます。

    ここから、フィールド名を取得してもらえれば・・・

SELECT 
    sysobjects.name AS TABLE_NAME,
    syscolumns.name AS COLUMN_NAME,
    syscolumns.xtype AS COLUMN_TYPE,
    syscolumns.prec AS COLUMN_PREC,
    syscolumns.scale AS COLUMN_SCALE,
    syscolumns.status AS COLUMN_STATUS,
    syscolumns.isnullable AS COLUMN_NULL,
    sysindexkeys.indid AS COLUMN_KEY,
    CAST(sysproperties.value AS varchar(100)) AS DESCRIPTION
From 
    sysobjects 
INNER JOIN 
    syscolumns 
ON 
    sysobjects.id = syscolumns.id 
LEFT OUTER JOIN 
    sysproperties 
ON 
    syscolumns.id = sysproperties.id AND 
    syscolumns.colid = sysproperties.smallid 
LEFT OUTER JOIN 
    sysindexkeys 
ON 
    sysobjects.id = sysindexkeys.id AND
    syscolumns.colid = sysindexkeys.colid,(
SELECT 
    TABLE_NAME 
From 
    INFORMATION_SCHEMA.TABLES 
Where 
    TABLE_TYPE = 'BASE TABLE') AS T1 
Where 
    sysproperties.name = 'MS_Description' AND
    sysobjects.name = T1.TABLE_NAME

※  該当のデータベース中の全てのテーブルの構造が取得され
    ますので・・・必要なテーブルのみでしたら、これを改造
    して下さい。

以上。

編集 削除
岡田 之仁  2004-01-20 20:15:45  No: 53034  IP: [192.*.*.*]

訂正します。

※  先のSQL文ですと、SQL Server でのテーブルのフィールドの説明
    が入力されていないと、何もレコードが得られません。

説明以外の一般的な情報を取得するには・・・

SELECT 
  sysobjects.name AS TABLE_NAME,
  syscolumns.name AS COLUMN_NAME,
  syscolumns.xtype AS COLUMN_TYPE,
  syscolumns.prec AS COLUMN_PREC,
  syscolumns.scale AS COLUMN_SCALE,
  syscolumns.status AS COLUMN_STATUS,
  syscolumns.isnullable AS COLUMN_NULL,
  sysindexkeys.indid AS COLUMN_KEY 
From 
  sysobjects 
INNER JOIN 
  syscolumns 
ON 
  sysobjects.id = syscolumns.id 
LEFT OUTER JOIN 
  sysproperties 
ON 
  syscolumns.id = sysproperties.id AND
  syscolumns.colid = sysproperties.smallid 
LEFT OUTER JOIN 
  sysindexkeys 
ON 
  sysobjects.id = sysindexkeys.id AND
  syscolumns.colid = sysindexkeys.colid,
(
SELECT 
  TABLE_NAME 
From 
  INFORMATION_SCHEMA.TABLES 
Where 
  TABLE_TYPE = 'BASE TABLE'
) AS T1 
Where 
  sysobjects.name = T1.TABLE_NAME 
order by 
  sysobjects.id,
  syscolumns.colid

とすれば、得られます。

お試し下さい。

以上。

編集 削除