如何获得数字列的确切类型,包括比例和精度
本文关键字:包括比 精度 类型 数字 何获得 | 更新日期: 2023-09-27 18:08:21
是否有一种方法可以知道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.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"]));
}