Какой тип данных в C# соответствует типу MS Access "Number"?
Согласно 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);
. . .
}
}
Почему он не может преобразовать в строку, int или double? Во что мне вместо этого конвертировать?
1 ответ
"Number" в конструкторе таблиц 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 будет аналогичным.