【问题标题】:VB.NET Access Database 255 Columns LimitVB.NET Access 数据库 255 列限制
【发布时间】:2014-04-10 10:44:20
【问题描述】:

我目前正在为使用 Visual Basic .NET 的客户端开发应用程序。这是对访问 Oracle 数据库、过滤列并对数据执行一些操作的应用程序的重写。现在,由于我无法控制的原因,客户希望为新应用程序使用 Access (.mdb) 数据库。这样做的问题是表的访问支持超过 255 列,因此客户建议将数据拆分为多个数据库/表。

即使表被拆分,在某些时候,我也必须同时查询所有列(我对两个表都进行了 INNER JOIN),这当然会产生错误。限制显然是同时可查询的列数而不是总列数。 是否有可能以某种方式规避 255 列的限制?我正在考虑使用 LINQ 来组合两个表的查询,即有一个适配器来模拟我可以执行查询的单个表。这样做的一个缺点是 .mdb 不是 LINQ-to-SQL 的一等公民(即不支持插入/更新等)。

作为一种解决方法,我可以重写我的东西,以便只需要所有列(我根据表中的列名动态创建控制元素)。因此,我需要查询前 250 列,然后查询接下来的 150 列。 是否有一个 Access-SQL 查询可以实现这样的功能。我想到了 SELECT TOP 255 * FROM dbnameSELECT * FROM dbname LIMIT 1,250 之类的东西,但这些都无效。

我还有其他选择吗?

非常感谢您的建议。

【问题讨论】:

  • 您是否也考虑了 Access db 的所有其他限制?
  • 我知道 Access 可能是最糟糕的选择,是的。不幸的是,客户明确希望使用 Access(我想是出于基础设施同质性的原因)
  • 我会使用 MS SQL - Express 版本是免费的,没有 Access 的限制。
  • 您会说客户有足够的知识来做出决定吗?我找不到任何合理的论据来坚持使用 Access 及其局限性。
  • 完全同意@Constanta。我们的部分工作是告诉客户他们错了。 :)

标签: vb.net linq ms-access limit


【解决方案1】:

ADO.NET DataTable 对象对它可以包含的列数没有实际限制。
因此,一旦您将大表拆分为两个表并在两个子表中设置相同的主键且列较少,您就可以在 VB.NET 端使用DataTable.Merge 方法。

在他们在 MSDN 上的示例中,它们显示了两个具有相同架构的表合并在一起,但如果您有两个完全不同的架构,但只有共同的主键,它也可以工作

 Dim firstPart As DataTable = LoadFirstTable()
 Dim secondPart As DataTable = LoadSecondTable()
 firstPart.Merge(secondPart)

我只用一列差异对此进行了测试,所以我不太确定这在性能方面是否是一个可行的解决方案。

【讨论】:

  • 啊,这有点像我的想法。会尝试 :) 性能并不是非常关键,因为它无论如何都是一个 GUI 应用程序,不会抛出数百万列。
  • 有效,正是我想要的。非常感谢!
  • 折腾了一阵子,发现并没有我想象的那么简单。当到达一个通用的 DataTable 时,我不能再对它执行任何 SQL 查询(只有类似 LINQ 的东西)。好吧,我想这是一个小小的不便,但不会破坏交易。
  • 对于简单的场景,您可以使用 DataTable.Select,或者将您的合并表与其他表放在一个 DataSet 中并设置一个或多个 DataRelation。好吧,当然它并没有被设计为数据库的内存替代品
【解决方案2】:

据我所知,使用 Access 无法直接绕过此问题。 如果您无法更改数据库,我能想到的唯一方法是制作一个了解您是该字段的包装器,自动将查询拆分为更多查询,然后将其重新组合到包含每一行的所有列的自定义类中. 例如,您可以将每个表拆分为多个表,以复制您要设置条件的字段。

TABLEA
Id | ConditionFieldOne | ConditionFierldTwo | Data1 | Data2 | ... | Data N |

TABLEA_1
Id | ConditionFieldOne | ConditionFieldTwo | Data1 | Data2 | ... | DataN/2 |

TABLEA_2
Id | ConditionFieldOne | ConditionFieldTwo | Data(N/2)+1 | Data(n/2)+2 | ... | DataN |

还有一个查询在哪里

SELECT * FROM TABLEA WHERE CONDITION1 = 'condition'

成为包装器

SELECT * FROM TABLEA_1 WHERE ConditionFieldOne = 'condition'
SELECT * FROM TABLEA_2 WHERE ConditionFieldOne = 'condition'

然后加入结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2020-07-16
    相关资源
    最近更新 更多