我目前正在使用Visual Basic .NET为客户端开发应用程序。它是对访问Oracle数据库,过滤列并对数据执行某些操作的应用程序的重写。现在,由于我无法控制的原因,客户端希望将Access(.mdb)数据库用于新应用程序。这样做的问题是这些表具有超过255列访问支持,因此客户端建议将数据拆分为多个数据库/表。
即使表被拆分,在某些时候,我必须同时查询所有列(我在两个表上都进行了INNER JOIN),这当然会产生错误。限制显然是在可同时查询的列数上,而不是在总列数上。 是否有可能以某种方式规避255列限制?我正在考虑使用LINQ来组合两个表的查询,即有一个模拟我可以执行查询的单个表的适配器。这样做的一个缺点是.mdb不是LINQ-to-SQL的一等公民(即不支持插入/更新等)。
作为一种解决方法,我可能能够重写我的东西,以便一次只需要所有列(我根据表中的列名动态创建控制元素)。因此,我需要查询前250列,然后查询以下150列。
是否有可以实现这样的Access-SQL查询。我想到了类似SELECT TOP 255 * FROM dbname
或SELECT * FROM dbname LIMIT 1,250
的内容,但这些内容无效。
我还有其他选择吗?
非常感谢你的建议。
答案 0 :(得分:0)
ADO.NET DataTable对象对它可以包含的列数没有实际限制 因此,一旦您将两个表中的大表拆分并在两个子列中设置相同的主键,并且在VB.NET一侧使用DataTable.Merge方法。
在他们的MSDN示例中,他们显示了两个具有相同模式合并在一起的表,但如果您有两个完全不同的模式,但只有共同的主键
,它也可以工作 Dim firstPart As DataTable = LoadFirstTable()
Dim secondPart As DataTable = LoadSecondTable()
firstPart.Merge(secondPart)
我只用一列差异对此进行了测试,因此我不太确定这在性能方面是否可行。
答案 1 :(得分:0)
据我所知,使用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'
然后加入结果。