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

时间:2012-12-19 06:06:58

标签: c# gridview sqldatareader

我从SqlDataReader语句返回ExecuteDataReader

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

情况如下:

  1. 首先我构建网格结构(结构在数据库中的表中,基于过去系统中存储过程的输出填充)
  2. 我执行数据读取器以执行存储过程
  3. 将数据读取器绑定到网格
  4. 问题是:如果存储过程中的一列是大写的,并且网格中的相关列是小写的,则网格不会填充。

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

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

      sqlDataReader阅读器; reader.executedatareadet();

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

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

      我希望能够做一些像

      这样的事情
      reader.SetName(i)
      

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我的建议是:分离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完全分开。