【问题标题】:The data source is of an invalid type. It must be an IListSource, IEnumerable or IDataSource数据源的类型无效。它必须是 IListSource、IEnumerable 或 IDataSource
【发布时间】:2011-04-25 12:21:26
【问题描述】:

我正在将使用 Enterprise Library 版本 2(主要是 DAAB)的 .NET 2.0 站点升级到 .NET 版本 3.5 和 EntLib 版本 5。我已经进行了必要的更改,现在我收到一个错误“数据source 的类型无效。它必须是 IListSource、IEnumerable 或 IDataSource”。我在尝试将 DevExpress ASPxGridView 控件的数据源设置为 IDataReader 时遇到此错误。

下面是我的代码。我们的应用程序广泛使用 IDataReaders....这些实例都需要修改吗?我在这里看到一篇文章说将 .ToList() 添加到数据源的末尾,但这不是 IDataReader 中的有效方法。请注意,虽然这个特定文件是 C#,但我们 99% 的应用程序是用 VB.NET 编码的。

private void GetRecentAddedCasesGridData()
    {
        dbReader = DAL.GetRecentAddedCases(iClientKey);
        if (dbReader != null)
        {
            GridRecentAddedCases.DataSource = dbReader;
            GridRecentAddedCases.DataBind();         
        }
        dbReader.Close();
        dbReader.Dispose();
        dbReader = null;
    }

【问题讨论】:

    标签: .net daab


    【解决方案1】:

    这是“DAAB 5”。

    根据 CodePlex 的“ctavares”:

    “这是一个错误修复。在 Entlib 3.0 中,我们添加了对 System.TransactionScope 的支持。事实证明我们做错了,并在负载下的大型系统中导致了一些间歇性故障。以至于这个错误花费了一些大公司花了很多钱来解决这个问题,他们最终从他们的系统中完全删除了 entlib。这个修复的一部分要求我们对我们拥有的数据库连接进行引用计数,这样我们就不会关闭它们,直到它们'不再使用(这是错误)。因此,我们需要包装数据读取器,以便我们可以正确检测读取器何时关闭并正确管理我们的连接。错误实际上是在某个地方的 codeplex 上发布的,但我忘记了工作项编号。"

    来源:http://entlib.codeplex.com/discussions/211288

    【讨论】:

      【解决方案2】:

      试试这个扩展方法

      public static IEnumerable<object[]> AsEnumerable(this IDataReader reader)
      {
          while (reader.Read())
          {
              var ret = new object[reader.FieldCount];
              reader.GetValues(ret);
              yield return ret;
          }
      }
      

      然后你可以写 GridRecentAddedCases.DataSource = dbReader.AsEnumerable().

      【讨论】:

      • 为什么需要这个改变???它是 .NET Framework 3.5 的东西吗?这是 DAAB 5 的事情吗?
      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      相关资源
      最近更新 更多