从DataReader对象中查找Field的数据类型

时间:2013-07-29 09:16:33

标签: c# asp.net

我有以下查询:

SqlCommand cmd = new SqlCommand("Select employee_id, 
          lastname, firstname from Employees", conn);

//Execute reader
SqlDataReader reader = cmd.ExecuteReader();

使用sqlDatareader,我只想知道数据类型字段:

假设我想知道字段employee_id的数据类型如何使用reader变量知道?

由于

6 个答案:

答案 0 :(得分:56)

reader.GetFieldType(int ordinal)

将返回字段的.NET类型,而:

reader.GetDataTypeName(int ordinal)

将返回一个字符串,表示数据源中字段的数据类型(例如varchar)。鉴于您描述的用例,GetFieldType可能对您更有用

答案 1 :(得分:21)

您可以使用以下方式获取所有相关元数据:

var metaDataList = new List<IDictionary<String, Object>>();

using (SqlDataReader reader = cmd.ExecuteReader())
{
    var hasRows = reader.HasRows;
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            dynamic fieldMetaData = new ExpandoObject();
            var columnName = reader.GetName(i);
            var value = reader[i];
            var dotNetType = reader.GetFieldType(i);
            var sqlType = reader.GetDataTypeName(i);
            var specificType = reader.GetProviderSpecificFieldType(i);
            fieldMetaData.columnName = columnName;
            fieldMetaData.value = value;
            fieldMetaData.dotNetType = dotNetType;
            fieldMetaData.sqlType = sqlType;
            fieldMetaData.specificType = specificType;
            metaDataList.Add(fieldMetaData);
        }
    }
}

它有点矫枉过正,但我​​无法想象你需要更多的类型信息。 您还可以在if语句中使用 hasRows 变量或进行异常处理。

答案 2 :(得分:5)

.GetFieldType(colnameIndex)用作:

If (reader.GetFieldType(0) Is GetType(String) Or reader.GetFieldType(0) Is
GetType(Date) )
{
...

}

或者它可以只是:reader.GetFieldType(0)

根据您的进一步逻辑,您可以将此功能转换为简单文本或条件形式。

答案 3 :(得分:1)

答案 4 :(得分:0)

您可以使用GetFieldType方法,传入要检索其类型的列的序号。它返回字段的System.Type。

例如,如果您想获取第一列的类型,可以var firstColType = reader.GetFieldType(0);

答案 5 :(得分:0)

虽然这是一篇老文章,但我偶然发现了它。因此,这是我的方法,因为您可以绝对,绝对地对DataReaders使用强类型,而不用#引用列(当列更改顺序时,与不强类型一样好)。

尝试这样的事情:

start