C# ADO.NET检查所选列中是否有列名

C# ADO.NET检查所选列中是否有列名,c#,sql,select,ado.net,C#,Sql,Select,Ado.net,这可能是一个琐碎的问题,但到目前为止,我无法理解它,因为我说过,我确信它相当简单,但我看不到它 我正在用ADO.NET做一个选择,类似这样 SELECT col1,col2 from table1 在我选择的数据略有不同的地方,我几乎没有选择。不,我已经构建了一个函数,在该函数中,我正在检索所选数据。存在至少一个select中出现的所有列,并且存在问题。由于我选择的数据并不总是相同的,我需要检查我试图从中获取数据的列是否在select中 例如,我尝试过这个,但它不起作用它总是返回false

这可能是一个琐碎的问题,但到目前为止,我无法理解它,因为我说过,我确信它相当简单,但我看不到它

我正在用ADO.NET做一个选择,类似这样

SELECT col1,col2 from table1  
在我选择的数据略有不同的地方,我几乎没有选择。不,我已经构建了一个函数,在该函数中,我正在检索所选数据。存在至少一个select中出现的所有列,并且存在问题。由于我选择的数据并不总是相同的,我需要检查我试图从中获取数据的列是否在select中

例如,我尝试过这个,但它不起作用它总是返回false

private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{
    return Reader.GetSchemaTable()
       .Rows
       .OfType<DataRow>()
       .Any(row => row["ColumnName"] == MyColumnName); 
}
当我以通常的方式(如getOrdinal或just Reader[MyCustomColum])尝试检查它是否为null时,当列不在exception中时,我会得到异常IndexOutOfBounds。我知道一种方法是捕获异常,但这不是我想要的方法,毕竟我不能相信没有其他方法可以检查列是否可用


谢谢

您可以尝试以下方法

private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{
    return Reader.GetSchemaTable()
       .Rows
       .OfType<DataRow>()
       .Any(row => string.Equals(row.Field<string>("ColumnName"), MyColumnName, StringComparison.InvariantCultureIgnoreCase)); 
}
private bool SpalteExistiert(FbDataReader Reader, string MyColumnName) 
{
    return Reader.GetSchemaTable()
       .Rows
       .OfType<DataRow>()
       .Any(row => row.Table.Columns.Contains(MyColumnName)); 
}

试试这个扩展方法

    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i = 0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }

为什么不处理这个异常呢?正如我所说的,我不能相信该语言没有提供任何其他方法来处理这个异常。另一个原因是,我依赖于异常的编程不是我喜欢的风格:您是否尝试过查看列集合而不是行?类似Reader.GetSchemaTable.Columns.OfType.Anycolumn=>column.ColumnName==MyColumnName;嗯,有时候你只需要从另一个角度看问题:。谢谢迈克尔,你的密码让我走上了正确的道路。DataColumn的功能不起作用,但我看到您和我一样,使用==进行字符串比较,这是不对的。将我的代码更改为。。。行[ColumnName].ToString.EqualsMyColumnName,StringComparison.InvariantCultureInogoreCase我得到了我想要的。但正如我所说,我看了大约2天,我没有注意到这一点;出于好奇,您比较了row[ColumnName]或column.ColumnName?这仍然会引发IndexOutOfBounds异常。@Michael我在SqlDataReader上试用过,效果很好。“IndexOutOfBounds”异常到底抛出在哪里?我尝试了这个,但没有得到异常,但它总是返回false。事实上你和我犯了同样的错误。您只是显式地强制转换它,在我的示例中,强制转换是在运行时完成的,但在这两种情况下比较都是错误的,这就是为什么结果总是为false的原因。@user3466562好吧,我在使用强制转换和不使用强制转换时都进行了尝试,并且在使用强制转换时得到了“true”。你确定你要查找的列真的在那里吗?嗯,问题可能是我用小写字母传递列名,也许你使用的格式与数据库中的格式相同。尝试写入与在DB中写入的列名不同的列名