从DataReader对象中查找Field的数据类型
本文关键字:Field 数据类型 查找 DataReader 对象 | 更新日期: 2023-09-27 18:25:14
我有以下查询:
SqlCommand cmd = new SqlCommand("Select employee_id,
lastname, firstname from Employees", conn);
// Execute reader
SqlDataReader reader = cmd.ExecuteReader();
假设我想知道字段employee_id
的数据类型。如何使用SqlDataReader
确定这一点?
reader.GetFieldType(int ordinal)
将返回该字段的.NET类型,而:
reader.GetDataTypeName(int ordinal)
将返回表示数据源中字段的数据类型的字符串(例如varchar
)。考虑到您描述
GetFieldType
可能对您更有用您可以通过以下方式获取所有相关元数据:
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变量,或用于异常处理。
使用.GetFieldType(colnameIndex)
作为:
If (reader.GetFieldType(0) Is GetType(String) Or reader.GetFieldType(0) Is
GetType(Date) )
{
...
}
也可以只是:reader.GetFieldType(0)
根据您的进一步逻辑,您可以将此函数塑造成简单的文本或条件形式。
.GetDataTypeName
可能是您想要的:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getdatatypename.aspx
您可以使用GetFieldType
方法,传入要检索其类型的列的序号。它返回字段的System.Type。
例如,如果您想获得第一列的类型,可以执行var firstColType = reader.GetFieldType(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