如何在C#中更改DataReader中的列名?

如何在C#中更改DataReader中的列名?,c#,gridview,sqldatareader,C#,Gridview,Sqldatareader,我有一个SqlDataReader,它是从ExecuteDataReader语句返回的 我只想:在绑定到网格之前,在数据读取器中更改一些列名 情况如下: 首先我构建网格的结构(结构在数据库中的表中,该表是根据过去系统中存储过程的输出填充的) 我执行数据读取器来执行存储过程 将数据读取器绑定到网格 问题是:如果存储过程中的一列是大写的,而网格中的相关列是小写的,那么网格不会填充 我有很多基于这种体系结构的存储过程。其中一些要显示许多行。正因为如此,我使用数据读取器来提高性能 我不想更改存储过程中的

我有一个
SqlDataReader
,它是从
ExecuteDataReader
语句返回的

我只想:在绑定到网格之前,在数据读取器中更改一些列名

情况如下:

  • 首先我构建网格的结构(结构在数据库中的表中,该表是根据过去系统中存储过程的输出填充的)
  • 我执行数据读取器来执行存储过程
  • 将数据读取器绑定到网格
  • 问题是:如果存储过程中的一列是大写的,而网格中的相关列是小写的,那么网格不会填充

    我有很多基于这种体系结构的存储过程。其中一些要显示许多行。正因为如此,我使用数据读取器来提高性能

  • 我不想更改存储过程中的列名(工作量太大)
  • 我不想将数据读取器的结果复制到另一个数据持有者(因为开销和低性能)
  • 我只知道更改数据读取器列名的一种方法

    sqlDataReader; reader.executedatareadet()

  • 例如,返回数据读取器后,我有两列(
    A,B

    我想将列
    'A'
    更改为
    'A'
    (转换为小写),然后将其像
    阅读器一样绑定到网格。GetName(I)

    我想做一些像这样的事情

    reader.SetName(i)
    

    但是我们不能更改数据读取器列名,您可以尝试将DbDataReader加载到具有预定义列名的DataTable中,然后在tout应用程序中将该表用作数据源

  • 您可以在GridView中更改列名
  • 如果可能,请使用新列名更改存储过程

  • 我的建议是:将UI和数据库代码分开。如果您的UI受到数据读取器的影响,那么我会问:“为什么UI会与数据读取器对话?”。这两件事是完全相反的堆栈两端。我想通过让DAL返回一个填充的POCO/DTO类型(或可能的视图模型类型)的具体列表来抽象这一点,即

    Customer
    类型通过以下属性进行了良好定义:

    public class Customer {
        public int Id {get;set;}
        public string Name {get;set;}
        ...
    }
    

    DAL上的任何实现更改现在都与UI完全分离。

    你好,damyan Bogoev,谢谢..但存储过程的结果太多了,我不想复制到另一个数据持有者,如datatabele。您可以将存储过程与ORM一起使用。将其映射到将其具体化为给定类型的方法,您将获得所需格式的数据。这里展示了如何使用OpenAccess ORM使用低级ADO API而不是列名来实现这一点。如果可能,请尝试使用Column的索引属性。谢谢Anand,但在问题中,我提到我不想做任何一个解决方案sugest..DataReader仅用于读取返回的数据。您读取这些值并将它们放入自己的数据结构或变量中。更改数据读取器结构的唯一方法是在case存储过程中的数据源或case GridView中的数据绑定控件上。您好,Marcel,谢谢,您完全正确。但是,在这种情况下,性能对我来说至关重要。您可以将数据复制到另一个数据持有者。我认为我唯一的选择是更改存储过程,因为似乎无法更改数据的列名reader@abianari在任何需要绑定大量数据的情况下,这将对性能产生完全零的影响(假设您的读卡器到POCO层的速度很快,像“dapper”这样的东西将是理想的)。唯一的性能是网络延迟和数据库查询性能。事实上,即使您绑定了大量数据,也有一些非缓冲/流式方式可以使用
    IEnumerable
    而不是
    List
    (事实上,“dapper”也内置了这种功能)。坦率地说:我拒绝你的要求。我花了很多时间寻找…@abianari。。。在性能关键的代码中,这不会成为瓶颈。Marc非常感谢……我必须实施并检查解决方案,稍后我会通知您。非常感谢
    var customers = dal.GetCustomers(...);
    ...
    someUI.DataSource = customers;
    
    public class Customer {
        public int Id {get;set;}
        public string Name {get;set;}
        ...
    }