Как получить точный тип числовых столбцов вкл. масштаб и точность?

Есть ли способ узнать точный тип столбца в DataTable? Прямо сейчас я делаю это:

DataTable st = dataReader.GetSchemaTable();
foreach (DataColumn col in st.Columns)
{
   var type = col.DataType;
}

Теперь с помощью type.Name я могу определить, является ли это число (int или decimal ..) или string но проблема в том, что мне нужен точный тип, например, если в базе данных скажем столбец Rate is NUMBER(4,3), то здесь, в моем коде, я получаю только тип как 'Десятичное число' и никакой информации о формате 4,3.

Теперь мне нужно отформатировать значения в соответствии с их типом, например. если Rate=1.4, это должно быть показано как 0001.400 (в соответствии с форматом NUMBER(4,3)). Следовательно, здесь, поскольку у меня нет информации, я не могу обрабатывать значения дальше. Есть ли вообще знать то же самое?

Спасибо

7 голосов | спросил IFlyHigh 11 J0000006Europe/Moscow 2014, 17:39:12

2 ответа


0

Вы можете использовать NumericPrecision и NumericScale:

using (var con = new SqlConnection(Properties.Settings.Default.RM2ConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM dbo.Test", con))
{
    con.Open();
    using (var reader = cmd.ExecuteReader())
    using (var schemaTable = reader.GetSchemaTable())
    {
        foreach (DataRow row in schemaTable.Rows)
        {
            string column = row.Field<string>("ColumnName");
            string type = row.Field<string>("DataTypeName");
            short precision = row.Field<short>("NumericPrecision");
            short scale = row.Field<short>("NumericScale");
            Console.WriteLine("Column: {0} Type: {1} Precision: {2} Scale: {3}", column, type, precision, scale);
        }
    }
}

Дополнительная информация: GetSchemaTable

Я протестировал его с новой таблицей с одним столбцом NumberColumn типа numeric(4, 3):

Column: NumberColumn Type: decimal Precision: 4 Scale: 3
ответил Rango 11 J0000006Europe/Moscow 2014, 17:48:06
0

DataTable, возвращаемый dataReader.GetSchemaTable (), является схемой базового результата. Эта таблица содержит столько записей, сколько столбцов в базовой таблице. Так что вам нужно перебрать строки. Каждая строка содержит метаданные одного столбца базовой таблицы. Вы можете получить метаданные столбца, как показано ниже

DataTable st = reader.GetSchemaTable();
                    foreach (DataRow row in st.Rows)
                    {
                        Console.Write(string.Format("ColumnName:{0} DataType:{1} Ordinal:{2} Precision:{3} Size:{4} Scale:{5}", 
                            row["ColumnName"], row["DataTypeName"], row["ColumnOrdinal"], 
                            row["NumericPrecision"], row["ColumnSize"], row["NumericScale"]));
                    }
ответил Kiran Hegde 11 J0000006Europe/Moscow 2014, 18:14:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132