如何获得数字列的确切类型,包括比例和精度

本文关键字:包括比 精度 类型 数字 何获得 | 更新日期: 2023-09-27 18:08:21

是否有一种方法可以知道DataTable中列的确切类型?现在我正在做这个:

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

现在有了type.Name,我可以找到它是一个数字(intdecimal ..)还是string,但问题是我需要确切的类型,例如,如果在数据库中让列RateNUMBER(4,3),那么在我的代码中,我只获得类型为"十进制",没有关于格式4,3的信息。

现在的要求是,我需要按照它们的类型格式化值,例如。如果Rate=1.4,它应该显示为0001.400(根据格式NUMBER(4,3))。因此在这里,由于我没有信息,我无法进一步处理这些值。还有什么方法可以知道吗?

谢谢

如何获得数字列的确切类型,包括比例和精度

您可以使用NumericPrecisionNumericScale:

using (var con = new SqlConnection(Properties.Settings.Default.MyConnectionString))
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

我用一个新的表对它进行了测试,该表具有类型为numeric(4, 3)的单列NumberColumn:

Column: NumberColumn Type: decimal Precision: 4 Scale: 3

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