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

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

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

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

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

благодаря

Вы можете использовать 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 

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