2009-08-26 12 views
4

J'aime enregistrer différents types de données C# dans une base de données Oracle (int, decimal, double, string, Guid, ...). Quelqu'un at-il un tableau indiquant quels types de données oracle utiliser?C# datatypes -> types de données oracle

J'ai trouvé des tableaux montrant ce que C# types de données à utiliser pour différents types de données Oracle mais pas l'inverse.

Répondre

10

Je ne sais pas si cela aide ou non, mais cela a été pris de l'ensemble ODP.NET utilisant réflecteur .NET:

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); 
} 

En interne, il ressemble à ODP.NET utilise (et quelques autres cartes) pour déterminer les types de données. En outre, pour gérer le type de données 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

Merci pour la réponse! Cela me donne des indices sur ce qu'il faut choisir. – Rolf

1

J'ai posé une question similaire concernant les types de données SQL Server et j'ai obtenu this answer qui peut également avoir une certaine pertinence pour vous.

+0

Oui, le problème est le même. Mais la solution ne contient pas de conversion spécifique à Oracle des types de données. – Rolf

+0

Nous rencontrons actuellement des problèmes avec les types de données. Nous avons créé notre table par champs dans des types de données comme NUMBER (18,3) et DATE. Nous avons créé des objets liés pour UDT à Oracle et en utilisant vs2010 odp.net add-on nous avons obtenu les classes. Actuellement, nous pouvons insérer NVARCHAR2, mais les valeurs NUMBER ou DATE sont NULL. J'ai cherché une question similaire à ne pas le répéter à nouveau. Si non, je vais le porter à la section des questions. Toutes les recommandations seraient géniales. Merci pour votre préoccupation –