2014-04-10 98 views
0

我目前正在開發一個使用Visual Basic .NET的客戶端的應用程序。它重寫了訪問Oracle數據庫的應用程序,過濾了列並對數據執行了一些操作。現在,由於我無法控制的原因,客戶端想要爲新應用程序使用Access(.mdb)數據庫。這樣做的問題是這些表有超過255列訪問支持,所以客戶建議將數據分割成多個數據庫/表。VB.NET Access數據庫255列限制

即使表格被拆分,在某些時候,我必須同時查詢所有列(我在兩個表上做了INNER JOIN),當然這會產生錯誤。顯然,限制的是同時查詢的列的數量而不是總列數。 是否有可能以某種方式規避255列限制?我在考慮使用LINQ來組合兩個表的查詢,即有一個模擬我可以執行查詢的單個表的適配器。這樣做的缺點是.mdb不是LINQ-to-SQL的第一級公民(即沒有支持插入/更新等)。

作爲一種解決方法,我可能會重寫我的東西,以便只需要在一個點上的所有列(我根據表中的列名動態創建控件元素)。因此,我需要查詢說,前250列,然後是150. 是否有一個Access-SQL查詢可以實現這樣的事情。我想到了類似SELECT TOP 255 * FROM dbnameSELECT * FROM dbname LIMIT 1,250的東西,但這些都無效。

我還有其他選擇嗎?

非常感謝您的建議。

+1

您是否考慮過Access db的所有其他限制? – Constanta

+0

我知道Access可能是最糟糕的選擇,是的。不幸的是,客戶明確希望使用Access(我想基於基礎設施的同質性原因) –

+0

我會使用MS SQL - Express版本是免費的,並且沒有Access的限制。 – Mych

回答

0

ADO.NET DataTable對象對其可能包含的列數沒有實際限制。
因此,一旦你將兩個表中的大表分開,並在兩個子表中設置了相同的主鍵,那麼可以在VB.NET端使用DataTable.Merge方法。

在其MSDN上的例子,他們表現出具有相同的架構兩個表合併在一起,但它的作品也,如果你有兩個完全不同的模式,只是在普通

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

主鍵我已經測試這只是只有一列差異,所以我不太確定這是一個在性能方面可行的解決方案。

+0

好啊,這有點像我腦子裏想的那樣。將嘗試:)性能不是非常關鍵,因爲它將是一個GUI應用程序,不會拋出數百萬列。 –

+0

工程,正是我在找的東西。非常感謝! –

+0

稍微擺弄一下,並不像我最初想象的那麼容易。當到達一個通用的DataTable時,我不能再對它執行任何SQL查詢(只有LINQ類的東西)。那麼,我認爲這是一個小小的不便,但不是一個破壞者。 –

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' 

,然後加入的結果。