Преобразователь данных Oracle в CLR - PullRequest
3 голосов
/ 21 апреля 2010

Где можно найти список сопоставления типов ODP и CLR? В базе данных Oracle тип NUMBER (9,0) появляется в приложении .NET как System.Decimal из драйвера MS Oracle, но как System.Int32 из драйвера ODP. Мне нужна точная спецификация типов, исходящих из базы данных (не отображение параметров CLR в DB).

Ответы [ 2 ]

4 голосов
/ 21 мая 2010

Запустите этот простой тест, чтобы получить сопоставления для SqlServer и Oracle (драйверы MS и ODP.NET):

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using Oracle.DataAccess.Client;

namespace DbOutTypeTest
{
    public class Program
    {
        private static string SqlServerConnectionString = @"";
        private static string OracleConnectionString = @"";

        private static void WriteHeader(string title)
        {
            Console.WriteLine("----------------------------------------------------------");
            Console.WriteLine("-- {0}", title);
            Console.WriteLine("----------------------------------------------------------");
        }

        private static void WriteRow(string key, string value)
        {
            Console.WriteLine("{0}\t\t{1}", key.PadRight(30, ' '), value);
        }

        private static void EnumerateTypes(IDbConnection connection, string template, IEnumerable<string> types)
        {
            EnumerateTypes(connection, template, types, (arg1, arg2) => { });
        }

        private static void EnumerateTypes(IDbConnection connection, string template, IEnumerable<string> types, Action<string, string> action)
        {
            connection.Open();
            using (var command = connection.CreateCommand())
            {
                foreach (var type in types)
                {
                    var value = "";
                    command.CommandText = string.Format(template, type);
                    try
                    {
                        using (var reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                                value = reader[0].GetType().FullName;
                            else
                                value = "<no data read>";
                        }
                    }
                    catch (Exception ex)
                    {
                        value = ex.Message;
                    }
                    WriteRow(type, value);
                    action(type, value);
                }
            }
        }

        private static IEnumerable<string> SqlServerIntegers()
        {
            yield return "tinyint";
            yield return "smallint";
            yield return "int";
            yield return "bigint";
            for (int precision = 1; precision <= 38; ++precision)
            {
                yield return "numeric(" + precision + ", 0)";
            }
            yield break;
        }

        private static IEnumerable<string> SqlServerFloatings()
        {
            yield return "real";
            yield return "float";
            for (int precision = 1; precision <= 38; ++precision)
            {
                for (int scale = 1; scale <= precision; ++scale)
                    yield return "numeric(" + precision + ", " + scale + ")";
            }
            yield break;
        }

        private static IEnumerable<string> OracleIntegers()
        {
            for (int precision = 1; precision <= 38; ++precision)
            {
                yield return "number(" + precision + ", 0)";
            }
            yield break;
        }

        private static IEnumerable<string> OracleFloatings()
        {
            for (int precision = 1; precision <= 38; ++precision)
            {
                for (int scale = 1; scale <= precision; ++scale)
                    yield return "number(" + precision + ", " + scale + ")";
            }
            yield break;
        }

        public static void Main(string[] args)
        {
            WriteHeader("C# types - CLR names");
            Console.WriteLine("{0}\t\t{1}",   "byte".PadRight(30, ' '), typeof(byte).FullName);
            Console.WriteLine("{0}\t\t{1}",  "short".PadRight(30, ' '), typeof(short).FullName);
            Console.WriteLine("{0}\t\t{1}",    "int".PadRight(30, ' '), typeof(int).FullName);
            Console.WriteLine("{0}\t\t{1}",   "long".PadRight(30, ' '), typeof(long).FullName);
            Console.WriteLine("{0}\t\t{1}",  "float".PadRight(30, ' '), typeof(float).FullName);
            Console.WriteLine("{0}\t\t{1}", "double".PadRight(30, ' '), typeof(double).FullName);

            var OracleToClrInteger = new Dictionary<string, string>();
            var OracleToClrFloating = new Dictionary<string, string>();
            var SqlServerToClrInteger = new Dictionary<string, string>();
            var SqlServerToClrFloating = new Dictionary<string, string>();

            WriteHeader("Oracle integers mapping (Oracle Data Provider)");
            using (var connection = new OracleConnection(OracleConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0}) FROM DUAL", OracleIntegers(), (type, value) => OracleToClrInteger.Add(type, value));
            }

            WriteHeader("SQLServer integers mapping");
            using (var connection = new SqlConnection(SqlServerConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0})", SqlServerIntegers(), (type, value) => SqlServerToClrInteger.Add(type, value));
            }

            WriteHeader("Oracle integers mapping (Microsoft Oracle Client)");
            using (var connection = new System.Data.OracleClient.OracleConnection(OracleConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0}) FROM DUAL", OracleIntegers());
            } 

            WriteHeader("Oracle floats mapping (Oracle Data Provider)");
            using (var connection = new OracleConnection(OracleConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0}) FROM DUAL", OracleFloatings(), (type, value) => OracleToClrFloating.Add(type, value));
            }

            WriteHeader("SQLServer floats mapping");
            using (var connection = new SqlConnection(SqlServerConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0})", SqlServerFloatings(), (type, value) => SqlServerToClrFloating.Add(type, value));
            }

            WriteHeader("Oracle floats mapping (Microsoft Oracle Client)");
            using (var connection = new System.Data.OracleClient.OracleConnection(OracleConnectionString))
            {
                EnumerateTypes(connection, "SELECT CAST(0 AS {0}) FROM DUAL", OracleFloatings());
            }

            WriteHeader("Suggested integer type mapping Oracle -> SqlServer");
            foreach (var pair in OracleToClrInteger)
            {
                if (pair.Value == "System.Decimal")
                    WriteRow(pair.Key, pair.Key.Replace("number", "numeric"));
                else
                {
                    if (!SqlServerToClrInteger.Values.Contains(pair.Value))
                        WriteRow(pair.Key, "???");
                    else
                        WriteRow(pair.Key, SqlServerToClrInteger.First(p => p.Value == pair.Value).Key);
                }
            }

            WriteHeader("Suggested floating type mapping Oracle -> SqlServer");
            foreach (var pair in OracleToClrFloating)
            {
                if (pair.Value == "System.Decimal")
                    WriteRow(pair.Key, pair.Key.Replace("number", "numeric"));
                else
                {
                    if (!SqlServerToClrFloating.Values.Contains(pair.Value))
                        WriteRow(pair.Key, "???");
                    else
                        WriteRow(pair.Key, SqlServerToClrFloating.First(p => p.Value == pair.Value).Key);
                }
            }

        }
    }
}

Самая интересная часть:

----------------------------------------------------------
-- Oracle integers mapping (Oracle Data Provider)
----------------------------------------------------------
number(1, 0)                        System.Int16
number(2, 0)                        System.Int16
number(3, 0)                        System.Int16
number(4, 0)                        System.Int16
number(5, 0)                        System.Int32
number(6, 0)                        System.Int32
number(7, 0)                        System.Int32
number(8, 0)                        System.Int32
number(9, 0)                        System.Int32
number(10, 0)                       System.Int64
number(11, 0)                       System.Int64
number(12, 0)                       System.Int64
number(13, 0)                       System.Int64
number(14, 0)                       System.Int64
number(15, 0)                       System.Int64
number(16, 0)                       System.Int64
number(17, 0)                       System.Int64
number(18, 0)                       System.Int64
number(19, 0)                       System.Decimal
number(20, 0)                       System.Decimal
number(21, 0)                       System.Decimal
number(22, 0)                       System.Decimal
number(23, 0)                       System.Decimal
number(24, 0)                       System.Decimal
3 голосов
/ 18 мая 2010

Стефан, У меня был такой же вопрос.

Ответ вы можете найти здесь, в установленной документации DevArt DotConnect for Oracle Help: мс-помощь: //Devart.Data.Oracle/dcOracle/DataTypeMapping.html

Возможно, вы захотите просмотреть онлайн, на сайте DevArt, чтобы найти ту же информацию: http://www.devart.com/dotconnect/oracle/docs/DataTypeMapping.html

Оба находятся в главе, озаглавленной «Сопоставление типов данных Entity Framework».

"Преобразование типов Oracle в .NET - Правила отображения типов из этой таблицы используются при создании модели из базы данных с помощью мастера моделей данных Entity в Visual Studio 2008/2010 и мастера обратного проектирования баз данных в Entity Developer .... "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...