这个问题已经在这里有一个答案:
- 检查列名SqlDataReader对象 22个回答
有没有一种方法,如果一个字段在基于IDataReader的对象存在W / O只检查一个IndexOutOfRangeException?
从本质上讲,我有需要一个基于IDataReader的对象和创建的记录的强类型列表的方法。 在1个实例,一个数据读取器具有一个领域,有的则没有。 我真的不希望重写所有的饲料此方法查询到包括某种形式的这一领域,如果我没有到。 我已经能够找出如何做到这一点迄今为止唯一的方法是将1场的独特扔到try / catch块,如下图所示。
try
{
tmp.OptionalField = reader["optionalfield"].ToString();
}
catch (IndexOutOfRangeException ex)
{
//do nothing
}
是否有一个更清洁的方式短期添加“可选字段”到其他查询或复制的装载方法,以便1个版本使用可选字段,其他没有的?
我在2.0框架也。
我最终找到使用的溶液reader.GetName(int)
方法。 我创建了下面方法以包含的逻辑。
public bool ColumnExists(IDataReader reader, string columnName)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
{
return true;
}
}
return false;
}
下面将为您给出一个数据读取列名的字符串列表。 (请记住结果是基于过去看了这么取决于读者读什么,可能是不一样的)。
var cols = reader.GetSchemaTable()
.Rows
.OfType<DataRow>()
.Select(row => row["ColumnName"]);
或者检查是否存在列:
public bool ColumnExists(IDataReader reader, string columnName)
{
return reader.GetSchemaTable()
.Rows
.OfType<DataRow>()
.Any(row => row["ColumnName"].ToString() == columnName);
}
看来我认错。 我知道你的实际列名在那里,但我会走上错误的道路。 该参考帮助明确了一点东西,但我仍然不知道是否有这样做的一种优雅的方式。 从上面的链接改编,你可以得到所有具有以下的列的列表:
List<string> myCols = new List<string>();
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
myCols.Add(row[schema.Columns["ColumnName"]]);
}
不幸的是它出现的指数,你只能访问schema.Rows,所以我不知道你能找到解决这些行第一循环的名字前检查。 在这种情况下,原来的解决方案似乎更优雅!
注:我原来的答复建议检查只需通过一列的存在:reader.GetSchemaTable()列[“optionalfield”]。
Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName")
这应该工作,试试这个:
private static bool ColumnExists(SqlDataReader reader, string columnName)
{
using (var schemaTable = reader.GetSchemaTable())
{
if (schemaTable != null)
schemaTable.DefaultView.RowFilter = String.Format("ColumnName= '{0}'", columnName);
return schemaTable != null && (schemaTable.DefaultView.Count > 0);
}
}
加载到一个DataTable,然后你可以检查列:
DataTable dataTable = new DataTable();
dataTable.Load(reader);
foreach (var item in dataTable.Rows)
{
bool columnExists = item.Table.Columns.Contains("ColumnName");
}
并不需要这么多的并发症,仅此:
bool bFieldExists = datareader.GetSchemaTable().Columns.Contains(strFieldName);