2016-06-28 64 views
0

我正在處理包含類似目錄的程序(主目錄和每個目錄包含子目錄,每個子目錄包含子目錄等,直到最終目錄包含.doc文件爲對象) 例: enter image description here訪問數據庫中的文件和目錄

我如何設計數據庫接受這個樹狀分層結構的話,我可以得到每個目錄,並在我的C#程序中打開的任何.DOC。

我是使用樹視圖和數據庫的初學者。

由於

編輯:

我有7個主要的文件夾和每個文件夾具有多個子文件夾的,並且可以是一些子folders1具有另一子folders2包含文件,其它子-folders1也有文件。 (所有文件幾乎都是10000)。

問題:

我如何填充這個結構導入到數據庫,然後我可以在樹視圖或列表框中列出它們?

感謝

回答

1

你可以去一個無限級無限結構只有一個表。我將在這裏使用MS SQL。但同樣的邏輯也適用於MS Access。

enter image description here

Id是行的唯一標識符。 ParentId是對該行在其下出現的Id的引用。換句話說,就是當前行的Parent。 名稱是包含目錄或文件名稱的字段。 IsFile(可以省略)是確定這是一個文件還是目錄。您實際上可以在代碼中應用一些邏輯來檢查該行是否有任何孩子。如果此行有子項,則可以簡單地將其標記爲目錄。

然後我們可以填寫此表的一些數據

enter image description here

如果您正在使用MS SQL服務器2005年及以後,你可以簡單地創建一個CTE(公共表表達式)來自動使整個樹。但Access不支持公用表表達式。

正如你在問題中標記了C#,你應該使用C#創建一個遞歸函數來調用它自己,如果該項目有孩子。

PopulateMenu(); 
 

 
private void PopulateMenu() 
 
{ 
 
    var parentItems = GetMenuItemsWhereParentIdIsNull(); 
 
    foreach(var item in parentItems) 
 
    { 
 
    Console.WriteLine(item["Name"]); 
 
    PopulateChildrenByItem(item); 
 
    } 
 
} 
 

 
private void PopulateChildrenByItem(object item) 
 
{ 
 
    var childItems = GetMenuItemsByParentId(item["Id"]); 
 
    foreach(var item in childItems) 
 
    { 
 
    Console.WriteLine("Child Item: " + item["Name"]); 
 
    
 
    //Recursively check for children of this child item 
 
    PopulateChildrenByItem(item["Id"]); 
 
    } 
 
} 
 

 
function object GetMenuItemsWhereParentIdIsNull() 
 
{ 
 
    //code for getting the parent items from access via ado.net 
 
    //query should be something like "SELECT * FROM Menu WHERE ParentId IS NULL" 
 
} 
 

 
function object GetMenuItemsByParentId(int Id) 
 
{ 
 
    //code for getting the child items by given parentId from access via ado.net 
 
    //query should be something like "SELECT * FROM Menu WHERE ParentId = <Id>" 
 
}

注意PopulateChildrenByItem被自稱以檢查迭代項目的子項。

我希望這將引導您正確的方向

乾杯

+0

文件夾有超過10000個字的文檔 –

+0

它不應該是父子結構的問題。你面臨的問題是什麼? –

+0

can 1 table has all this files without error? –

1

既然你是一棵樹,你可以看看這個:

public class FolderEntry { 

    public string Name { 
     get; set; 
    } 

    public List<FolderEntry> FolderEntries { 
     get; set; 
    } 

    public List<FileEntry> Files { 
     get; set; 
    } 


    } 


    public class FileEntry { 

    public string Name { 
     get; set; 
    } 

    public string FileType { 
     get; set; 
    } 

    } 

數據庫設計:

Database

這不是一個完整的解決方案,但可以從一開始。 要用數據填充類,我建議你實現一個存儲庫模式

+0

我嘗試這個概念,但我無法理解類和Folders_FKIndex1? –

+0

樹是遞歸結構。所以一個節點可以有一個節點等等。一個文件是**總是**在一個文件夾中。所以文件和文件夾與ForeignKey(FK)有很強的關係 – lokusking

+0

現在瞭解 - 謝謝 –