2009-08-26 3 views
4

Мне нравится сохранять разные типы данных C# в базе данных Oracle (int, decimal, double, string, Guid, ...). Кто-нибудь имеет таблицу, показывающую, какие типы данных оракула использовать?C# datatypes -> oracle datatypes

Я нашел таблицы, показывающие, какие типы данных C# использовать для разных типов данных оракула, но не наоборот.

ответ

10

Я не уверен, если это поможет или нет, но это было взято из ODP.NET сборки с использованием .NET Reflector:

internal static void InsertTableEntries() 
{ 
    s_table.Add(typeof(byte), OracleDbType.Byte); 
    s_table.Add(typeof(byte[]), OracleDbType.Raw); 
    s_table.Add(typeof(char), OracleDbType.Varchar2); 
    s_table.Add(typeof(char[]), OracleDbType.Varchar2); 
    s_table.Add(typeof(DateTime), OracleDbType.TimeStamp); 
    s_table.Add(typeof(short), OracleDbType.Int16); 
    s_table.Add(typeof(int), OracleDbType.Int32); 
    s_table.Add(typeof(long), OracleDbType.Int64); 
    s_table.Add(typeof(float), OracleDbType.Single); 
    s_table.Add(typeof(double), OracleDbType.Double); 
    s_table.Add(typeof(decimal), OracleDbType.Decimal); 
    s_table.Add(typeof(string), OracleDbType.Varchar2); 
    s_table.Add(typeof(TimeSpan), OracleDbType.IntervalDS); 
    s_table.Add(typeof(OracleBFile), OracleDbType.BFile); 
    s_table.Add(typeof(OracleBinary), OracleDbType.Raw); 
    s_table.Add(typeof(OracleBlob), OracleDbType.Blob); 
    s_table.Add(typeof(OracleClob), OracleDbType.Clob); 
    s_table.Add(typeof(OracleDate), OracleDbType.Date); 
    s_table.Add(typeof(OracleDecimal), OracleDbType.Decimal); 
    s_table.Add(typeof(OracleIntervalDS), OracleDbType.IntervalDS); 
    s_table.Add(typeof(OracleIntervalYM), OracleDbType.IntervalYM); 
    s_table.Add(typeof(OracleRefCursor), OracleDbType.RefCursor); 
    s_table.Add(typeof(OracleString), OracleDbType.Varchar2); 
    s_table.Add(typeof(OracleTimeStamp), OracleDbType.TimeStamp); 
    s_table.Add(typeof(OracleTimeStampLTZ), OracleDbType.TimeStampLTZ); 
    s_table.Add(typeof(OracleTimeStampTZ), OracleDbType.TimeStampTZ); 
    s_table.Add(typeof(OracleXmlType), OracleDbType.XmlType); 
    s_table.Add(typeof(OracleRef), OracleDbType.Ref); 
} 

Внутри он выглядит как ODP.NET использует это (и некоторые из них другие карты) для определения типов данных. Кроме того, для обработки типа данных NUMBER:

internal static OracleDbType ConvertNumberToOraDbType(int precision, int scale) 
{ 
    OracleDbType @decimal = OracleDbType.Decimal; 
    if ((scale <= 0) && ((precision - scale) < 5)) 
    { 
     return OracleDbType.Int16; 
    } 
    if ((scale <= 0) && ((precision - scale) < 10)) 
    { 
     return OracleDbType.Int32; 
    } 
    if ((scale <= 0) && ((precision - scale) < 0x13)) 
    { 
     return OracleDbType.Int64; 
    } 
    if ((precision < 8) && (((scale <= 0) && ((precision - scale) <= 0x26)) || ((scale > 0) && (scale <= 0x2c)))) 
    { 
     return OracleDbType.Single; 
    } 
    if (precision < 0x10) 
    { 
     @decimal = OracleDbType.Double; 
    } 
    return @decimal; 
} 
+0

Спасибо за ответ! Это дает мне некоторые подсказки относительно того, что выбрать. – Rolf

1

Я задал аналогичный вопрос о типах данных SQL Server и получил this answer, который может иметь некоторое отношение к вам.

+0

Да, проблема такая же. Но решение не содержит специфического для Oracle преобразования типов данных. – Rolf

+0

У нас возникли проблемы с типами данных. Мы создали нашу таблицу по полям в типах данных, таких как NUMBER (18,3) и DATE. Мы создали связанные объекты для UDT в oracle и с помощью vs2010 odp.net add-on мы получили классы. В настоящее время мы можем вставить NVARCHAR2, но значения NUMBER или DATE начинаются как NULL. Я искал аналогичный вопрос, чтобы не повторять его снова. Если я не перенесу его в раздел вопросов. Любые рекомендации были бы замечательными. Благодарим вас за беспокойство –