【问题标题】:Field name not in DataSet字段名称不在数据集中
【发布时间】:2012-10-02 11:16:51
【问题描述】:

编辑:1)名称!=名称,这不是问题。该代码在 99.9999% 的时间内都可以工作,并且偶尔会在生产中失败(从不在实验室条件下>_

编辑:2)仅供参考。为了测试,我运行了以下代码

...
var name = row["Name"].ToString().ToLower();
var name2 = row["name"].ToString().ToLower();
...

这实际上工作得很好,这表明至少在框架 4 中, row[xx] 不区分大小写。无论哪种方式,这都不是我不幸看到的问题。希望是:)

这是一个简单的 sn-p 代码,它给我们带来了问题。不仅仅是这段代码,实际上是任何看起来像这样的代码。常见的部分是 row["name"] 抛出异常,声称 "name" 不是表 Table 的列。

var command = new SqlCommand("SELECT Name FROM Table1");
DataSet result = helper.ExecuteQuery(command); 
if (result == null || result.Tables.Count != 1)
{
    return;
}
foreach (DataRow row in result.Tables[0].Rows)
{
    var name = row["Name"].ToString().ToLower();                
}

helper.ExecuteQuery 返回一个DataSet,

如您所见,我们知道结果是一个数据集,即它不为空并且包含一个表。

我们知道它有行,因为我们处于 foreach 循环中。我们知道 Name 作为列存在,因为运行的 sql 语句总是被硬编码到其中,没有歧义或聪明。

任何想法(与问题有关?)有一些变通方法,使用 int 索引器,大多数这些查询只返回一或两列。首先检查列,诸如此类的事情,但是我记得这么多年了,我从来没有遇到过这个问题。

【问题讨论】:

  • 您是否在调试器中对行的列集合达到了峰值?这应该是你做的第一件事。当您说“总是非常硬编码”时,听起来您并不是 100% 确定的。查看调试器中的集合并找出确切的名称。
  • 需要看看 helper.ExecuteQuery 在做什么...
  • 只是一个观察,在您的 sql 查询中,您将列名指定为 name(所有小写字母),但是当从 Dataset 访问列时,您给出了 Name(标题大小写).isn索引名称不区分大小写吗?
  • Dangit @th1rdey3 :D 你应该让他注意到……喂人一条鱼,教人钓鱼……等等。
  • 是的,这可能不是一个很好的例子,它是所有不同情况的模拟组合。无法在调试器中查看,除了部署时从未发生过,然后很少发生。

标签: c# sql-server tsql ado.net dataset


【解决方案1】:

你可以试试name in lower

 var name = row["name"].ToString().ToLower(); //name in lower

【讨论】:

  • 代码在 99.9999% 的时间里都能正常工作。所以这不是问题。我将更新问题以使其更清楚。谢谢
  • 对不起 Candie,不,这不是问题,所以没有修复。感谢您的尝试:)
【解决方案2】:

当通过列名引用时,大小写确实很重要。

row["Name"] 不同于 row["name"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多