如何获得确切的数字列类型,包括。规模和精度?

时间:2014-06-11 13:39:13

标签: c# sql datatable ado.net sqldatareader

有没有办法知道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))。因此,因为我没有信息,所以我无法进一步处理这些值。反正知道了吗?

由于

2 个答案:

答案 0 :(得分:6)

您可以使用NumericPrecisionNumericScale

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

答案 1 :(得分:0)

dataReader.GetSchemaTable()返回的DataTable是基础结果的模式。此表包含基础表中多列的许多记录。所以你需要循环遍历行。每行包含基础表的单个列的元数据。您可以获取列的元数据,如下所示

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