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

7

我有一个SqlDataReader,从ExecuteDataReader语句返回。

我想要的是:在绑定到网格之前更改数据读取器中的某些列名。

以下是情况:

  1. 首先我构建网格的结构(结构在数据库表中,该表根据系统中存储过程的输出填充)
  2. 执行数据读取器以执行存储过程
  3. 将数据读取器绑定到网格

问题在于:如果存储过程中的一列为大写,并且与网格中的相关列为小写,则网格不会填充。

而且我有很多基于此架构的存储过程。其中一些需要显示许多行。因此,我使用数据读取器以提高性能。

  1. 我不想更改存储过程中的列名(太麻烦了)
  2. 我不想将数据读取器的结果复制到另一个数据持有者中(因为开销大,性能低)
  3. 我只需要更改数据读取器中的列名的一种方法

    sqlDataReader reader; reader.executedatareadet();

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

我想将列'A'更改为'a'(转换为小写),然后再绑定到网格,如reader.GetName(i)

我希望能够像这样做

reader.SetName(i)

但似乎我们无法更改数据读取器的列名称。


尽可能使用列的索引属性,而不是列名。 - Pratik
3个回答

1
你可以尝试使用预定义的列名将 DbDataReader 加载到 DataTable 中,然后在应用程序中使用该表作为数据源。

嗨,Damyan Bogoev,谢谢。但是存储过程的结果太多了,我不想复制到另一个数据持有者(如datatabele)中。 - abianari
你可以使用ORM来编写一个存储过程。将其映射到一个方法,使其能够将数据转换为所需的格式。这样就可以得到需要的数据了。 - Damyan Bogoev
这里展示了如何使用OpenAccess ORM和低级别的ADO API来实现:http://www.telerik.com/help/openaccess-orm/openaccess-tasks-adonet-stored-procedures-materialize-result-set.html - Damyan Bogoev

1
  1. 您可以更改GridView中的列名
  2. 如果可能,请使用新的列名修改存储过程

谢谢Anand,但是在问题中我提到我不想采用你建议的任何一种解决方案。 - abianari
DataReader仅用于读取返回的数据。您可以读取这些值并将它们放入自己的数据结构或变量中。更改数据读取器的结构的唯一方法是在数据源中,例如存储过程或数据绑定控件,例如GridView。 - andy

0
我的建议是:分离用户界面和数据库代码。如果您的用户界面受到数据读取器的影响,那么这只会让我问:“为什么用户界面要与数据读取器通信?”这两个东西处于完全相反的堆栈端点。我建议通过使您的数据访问层(DAL)返回一个填充了 POCO/DTO 类型(或可能是视图模型类型)的具体列表来抽象化它。
public List<Customer> GetCustomers({some filter etc}) {...}

然后绑定到那个,即

var customers = dal.GetCustomers(...);
...
someUI.DataSource = customers;

Customer类型随后被定义,具有诸如以下属性:

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

现在,数据访问层(DAL)的任何实现更改都已完全与用户界面(UI)分离。


嗨 Marcel,谢谢。你是完全正确的。但在这种情况下,性能对我来说非常关键。你将数据复制到另一个数据持有者中。我认为对我唯一的选择就是更改存储过程,因为似乎没有办法更改数据阅读器的列名。 - abianari
在任何情况下,只要绑定的数据量是“合理”的,这对性能完全没有影响(假设你的读取器到POCO层很快;像“dapper”这样的东西是理想的)。唯一会影响性能的是网络延迟和数据库查询性能。实际上,即使您绑定了大量数据,也有非缓冲/流式传输的方法可以使用IEnumerable<T>而不是List<T>来完成相同的操作(事实上,“dapper”也内置了这个功能)。坦率地说:我拒绝你的说法。我花了很多时间寻找... - Marc Gravell
@abianari ... 在性能关键的代码中,这不会成为瓶颈。 - Marc Gravell
Marc非常感谢...我必须实施并检查解决方案,稍后再通知您。非常感谢。 - abianari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接