我没发现DataReader有HasColumn的样的方法
所以用
object value = null;
try
{
    value = dr["Name"];
}
Catch
{}
-----------
但我在对10W条数据进行赋值的时候
如果不出错是22秒
如果try里面出错,那所花的时间就是160秒
所以这里有严重的性能问题
想改成
object value = null
if(dr.HasColumn("Name"))
{
    value=dr["Name"]
}那dr有没有HasColumn的方法呢?
谢谢

解决方案 »

  1.   

    static bool readerExists(SqlDataReader dr, string columnName)
            {            dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" +            columnName + "'";            return (dr.GetSchemaTable().DefaultView.Count > 0);        }
      

  2.   

    换用datatable就有rows.Table.Columns.Contains( "fieldname ")datareader还必须得去try catch
      

  3.   

    如果是10W条数据,你可以在循环外Try一次就可以了,不要放在循环里Try,这样性能应该差距不会太大,
      

  4.   

    在循环外Try,判断是否存在Name列,给个Bool标示,在循环里只要判断Bool值,确定是否取Name列的值
      

  5.   

    10万条数据就不要取数据了 直接取表结构 然后再
    rows.Table.Columns.Contains( "fieldname ")
      

  6.   

    当使用 DataReader 的时候,有哪些列你自己应该是知道的。(因为sql文是你写的)
    所以正确取列值,本来代码自己应该保证的。也就是说写错是你自己的错。如果你想做一个泛用的方法,你应该用index去取值,而跟名字无关。但是...DataReader.FieldCount 可以告诉你有多少列
    DataReader.GetName(int) 可以告诉你指定列的列名
    DataReader.GetSchemaTable() 可以获得你结果的定义
    比如:reader.GetSchemaTable().Rows[0]["ColumnName"] 你可以获得一个列名。
    那么:DataRow[] rows = reader.GetSchemaTable().Select("ColumnName='xxx'");
         if (rows != null && rows.Count > 0)
            //存在xxx列或者,像下面一样操作DataReader,做到和列名无关。
    // Given a SqlDataReader, use the GetValues
    // method to retrieve a full row of data.
    // Test the GetValues method, passing in an array large
    // enough for all the columns.
    Object[] values = new Object[reader.FieldCount];
    int fieldCount = reader.GetValues(values);Console.WriteLine("reader.GetValues retrieved {0} columns.", fieldCount);
    for (int i = 0; i < fieldCount; i++)
      Console.WriteLine(values[i]);