时间:2019-03-17 标签:c#datatypes->甲骨文数据类型

发布于 2024-08-03 04:34:06 字数 156 浏览 5 评论 0原文

我喜欢在 Oracle 数据库中保存不同的 C# 数据类型(int、decimal、double、string、Guid,...)。有谁有一个表显示要使用哪些 Oracle 数据类型?

我找到了一些表格,显示了哪些 c# 数据类型可用于不同的 oracle 数据类型,但反之则不然。

I like to save different c# data types in a Oracle database (int, decimal, double, string, Guid, …). Does anyone have a table showing what oracle data types to use?

I have found tables showing what c# data types to use for different oracle data types but not the other way around.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

懵少女 2024-08-10 04:34:06

我不确定这是否有帮助,但这是从使用 .NET Reflector 的 ODP.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);
}

在内部,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;
}

I'm not sure if this helps or not, but this was taken from the ODP.NET assembly using .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);
}

Internally it looks like ODP.NET uses this (and a few other maps) to determine data types. Also, to handle the NUMBER data type:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文