61

我有以下查询:

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

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

假设我想知道 field 的数据类型employee_id。我如何使用SqlDataReader?

4

6 回答 6

73

reader.GetFieldType(int ordinal)

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

reader.GetDataTypeName(int ordinal)

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

于 2013-07-29T09:25:14.940 回答
34

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

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变量。

于 2014-11-29T09:43:29.650 回答
6

用作.GetFieldType(colnameIndex)

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

}

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

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

于 2013-07-29T09:23:06.483 回答
2

.GetDataTypeName 可能是你所追求的:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getdatatypename.aspx

于 2013-07-29T09:19:17.560 回答
0

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

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

于 2013-07-29T09:26:14.647 回答
0

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

尝试这样的事情:

    using (dsSomeDataSet dsList = new dsSomeDataSet())
{
    using (System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand())
        {

        //blah blah blah take care of parameter definitions for the stored proc

        using (SqlDataReader sqlReader = sqlCmd.ExecuteReader())
            {
                while (sqlReader.Read())
                {
                    //populate each returning row
                    dsSomeDataSet.tATablesRow rowNote = dsList.tATable.tATablesRow();

                //using the actual field name, strongly typed, required using the declared dataset variable, not the dataset object             
                    rowNote.ThisField'sName = new Guid(sqlReader[ dsList.tATable.ThisField'sName.ColumnName].ToString() );

                dsList.tNotes.AddtNotesRow( rowNote );
                }
                sqlReader.Close();
            }


        }   //releases the command resources
    }   //releases the dataset resources
于 2019-12-26T17:29:43.330 回答