具有重复列名的 DataReader

Posted

技术标签:

【中文标题】具有重复列名的 DataReader【英文标题】:DataReader with duplicate column names 【发布时间】:2008-12-10 22:37:35 【问题描述】:

尝试从具有多个同名列的 DataReader 获取数据的最佳处理方式是什么?

由于涉及的工作量很大,并且我们不想通过更改我们用来检索数据的存储过程而失去供应商的支持,我正在尝试寻找另一种方法来访问一个列无需重写存储过程即可在数据读取器中多次显示。

有什么想法吗?

编辑: 好的,从数据读取器实际填充的函数在多个地方使用,因此该函数有可能被不同的存储过程调用。我所做的是使用索引执行 GetName 以检查它是否是正确的列,如果是,则提取其值。

【问题讨论】:

【参考方案1】:

如果您知道列的索引,则通过索引访问它。

【讨论】:

【参考方案2】:

你不能使用列序号吗? 0 代表第 1 个,1 代表第 2 个,以此类推?

【讨论】:

【参考方案3】:

您必须通过索引号引用该列;即阅读器[5].ToString();读取第 5 列中的数据。

【讨论】:

【参考方案4】:

基于“编辑”段落中描述的原始发布者的方法,这里有一个扩展方法,它将根据列名和该名称的索引给出值,例如,0 表示 name 的第一个实例,1 表示第二,等等:

using System;

namespace WhateverProject 

    internal static class Extentions 

        // If a query returns MULTIPLE columns with the SAME name, this allows us to get the Nth value of a given name.
        public static object NamedValue(this System.Data.IDataRecord reader, string name, int index) 
            if (string.IsNullOrWhiteSpace(name)) return null;
            if (reader == null) return null;
            var foundIndex = 0;
            for (var i = 0; i < reader.FieldCount; i++) 
                if (!reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase)) continue;
                if (index == foundIndex) return reader[i];
                foundIndex++;
            
            return false;
        
    

这样使用它:

var value1 = reader.NamedValue("duplicatedColumnName", 0);
var value2 = reader.NamedValue("duplicatedColumnName", 1);

【讨论】:

以上是关于具有重复列名的 DataReader的主要内容,如果未能解决你的问题,请参考以下文章

具有重复列名的 DataReader

具有重复列名的整洁 data.frame

PHP MySQL内部连接具有相同的列名[重复]

重命名具有任意顺序和重复列名的多索引列

具有相同列名的命名查询内部连接表的重复数据/值

使用 combn 计算不重复的列名组合