【问题标题】:How to Change Column Name In DataReader In C#?如何在 C# 中更改 DataReader 中的列名?
【发布时间】:2012-12-19 06:06:57
【问题描述】:

我有从ExecuteDataReader 语句返回的SqlDataReader

我想要的只是:在数据阅读器中更改一些列名,就在绑定到网格之前。

情况如下:

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

这里的问题是:如果存储过程中的一列是大写的,而网格中的相关列是小写的,则网格不会填满。

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

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

    sqlDataReader 阅读器; reader.executedatareadet();

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

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

我希望能够做类似的事情

reader.SetName(i)

但我们无法更改数据读取器列名

【问题讨论】:

  • 尝试使用列的索引属性而不是列名。如果可能的话。

标签: c# gridview sqldatareader


【解决方案1】:
  1. 您可以在 GridView 中更改列名
  2. 如果可能的话,用新的列名改变存储过程

【讨论】:

  • 感谢阿南德,但在问题中我提到我不想做任何你建议的解决方案..
  • DataReader 仅用于读取返回的数据。您读取这些值并将它们放入您自己的数据结构或变量中。更改数据读取器结构的唯一方法是在您的案例存储过程中的数据源或您的案例 GridView 中的数据绑定控制。
【解决方案2】:

您可以尝试将 DbDataReader 加载到具有预定义列名的 DataTable 中,然后将该表用作 tout 应用程序中的数据源。

【讨论】:

  • 嗨 damyan Bogoev 谢谢..但是存储过程的结果太多了,我不想复制到像 datatablele 这样的另一个数据持有者。
  • 你可以使用带有 ORM 的存储过程。将其映射到将其具体化为给定类型的方法,您将获得所需格式的数据。
  • 这里展示了如何使用 OpenAccess ORM 使用低级 ADO API telerik.com/help/openaccess-orm/…
【解决方案3】:

我的建议是:将 UI 和数据库代码分开。如果您的 UI 受到数据读取器的影响,那么这只会让我问:“为什么 UI 与数据读取器通信?”。这两件事在堆栈的完全相反的两端。我会通过让您的 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 在任何绑定 sane 数据量的情况下,这将对性能产生完全为零的差异(假设您的读者-to-POCO 层很快;像“dapper”这样的东西是理想的)。唯一要显示的性能是网络延迟和数据库查询性能。事实上,即使您要绑定大量数据,也有非缓冲/流式方法可以对IEnumerable&lt;T&gt; 而不是List&lt;T&gt; 执行相同的操作(事实上,“dapper”也内置了该功能)。坦率地说:我拒绝你的要求。我花了 很多 时间寻找...
  • @abianari ... 在性能关键代码中,这根本不会成为瓶颈。
  • Marc 非常感谢....我必须实施并检查解决方案,稍后我会通知。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多