0

http://msdn.microsoft.com/en-us/library/office/aa211091(v=office.11 ​​).aspx によると、MS Jet データベース エンジンには "NUMBER" データ型がありません。それでも、クエリを実行しているテーブルの MS Access デザイン ビューに表示されるのは、

クエリで取得している最初の列のデータ型は「NUMBER」データ型です。

その値を Int32 と Double に変換しようとすると、次のコードが壊れます。

// A set comprised of two columns are returned from a query in cmd
using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader())
{
    while (oleDbD8aReader != null && oleDbD8aReader.Read())
    {
        //var accountID = oleDbD8aReader.GetString(0); // <-- this fails (it's a number, not a string)
        //var accountID = oleDbD8aReader.GetInt32(0);   // <-- this also fails!
        var accountID = oleDbD8aReader.GetDouble(0); // <-- as does this!
        var deptName = oleDbD8aReader.GetString(1);    
        . . .
    }
}

string、int、または double への変換に失敗するのはなぜですか? 代わりに何に変換すればよいですか?

4

1 に答える 1

2

Access テーブル デザイナーの「数値」は、特定の型そのものではなく、データ型のコレクションです。実際の型を確認するには、フィールド リストの下にあるフィールド プロパティを確認する必要があります。

または、フィールド タイプをプログラムで検索することもできます。Delphi と DAO を使用すると、コードは次のようになります。

uses
  DAO_TLB; //may need importing first via Component|Import Component

procedure Foo;
var
  Engine: DBEngine;
  DB: Database;
  Table: TableDef;
begin
  Engine := CoDBEngine.Create;
  DB := Engine.OpenDatabase('C:\Somewhere\Database.mdb',
    {exclusively?}False, {read-only?}True, '');
  Table := DB.TableDefs['MyTableName'];
  case Table.Fields['MyFieldName'].Type_ of
    dbBoolean: ;
    dbByte: ;
    dbInteger: ;
    dbLong: ;
    dbCurrency: ;
    dbSingle: ;
    dbDouble: ;
    dbDate: ;
    dbBinary: ;
    dbText: ;
    dbLongBinary: ;
    dbMemo: ;
    dbGUID: ;
    dbBigInt: ;
    dbVarBinary: ;
    dbChar: ;
    dbNumeric: ;
    dbDecimal: ;
    dbFloat: ;
    dbTime: ;
    dbTimeStamp: ;
  end;
end;

C#/ADO.NET に相当するものは似ていると思います。

于 2013-10-23T22:38:49.060 に答える