2011-12-05 115 views
0

一些背景的問題:有沒有辦法通過C#對象SQL存儲過程

我有對象的層次結構,看起來像這樣:ER diagram of the database

每個「CallAction」將有隊列或基於'ActionType'的問題。
當通過網站創建工作流程時,它僅限於2個級別的問題。所有這些都已經在C#中實現,並且在SQL Server中創建了表。我現在需要找到一種方法將所有這些添加到數據庫中。當我擴展網站面板(一個開源項目)時,我試圖遵循他們一直使用的相同標準,這意味着每次調用數據庫都是使用存儲過程完成的。我有一個方法可以傳遞'工作流'到SQL存儲過程並處理SQL中的多個不同層次,或者我將不得不創建多個存儲過程並處理不同的層次在我的C#代碼中調用基於層次結構的不同存儲過程?

我也明白,我可以直接使用SQLCommandLinQ訪問數據庫,但我寧願使用存儲過程(如果可能的話)。

+0

雖然它不是最乾淨的方式,但您可以 - 如果需要使用XML。 SQL服務器擁有第一個公民XML支持。在.NET中進行序列化並將其作爲參數傳遞給存儲過程,然後您可以反序列化它。 – Polity

回答

3

沒有像SQL Server中的對象那樣的東西。您可以將屬性作爲命名參數傳遞給存儲過程(這種方式不需要維護它們的順序),並將存儲過程放到需要的地方:更新,插入,刪除。

對於整個工作流程,您應該使用矩陣參數。谷歌「定向網絡矩陣表示」。一個單一的矩陣將代表你所有的對象和它們相互指向的鏈接(1-向前,-1 - 向後)。如果你想要更有趣,而不是使用數字,你可以創建一個字符串矩陣,存儲對象名稱和方向。如果您將方向乘以實數,則可以獲得連接權重(例如概率)。

但是,這是一個非常倒退的做法。你應該用C#創建這種適配器,並進行批量插入/更新。

對不起,我不能更有幫助。祝你好運。

編輯:因爲您的「工作流程」看起來更像是一個本體而不是真實的工作流程,所以您可以看到關於SPARQL和這種本體特定的SQL語言。或谷歌「存儲在SQL數據庫本體」

+0

謝謝。這給了我很多東西來看看。 – firthh

1

我覺得CLR存儲過程可以幫助你:

http://msdn.microsoft.com/en-us/library/ms131094.aspx

+1

CLR procs是從SQL運行的C#,因此不適合此查詢的參數。你不能在它們中傳遞C#對象,只有SQL數據。 –

+1

@GregoryKlopper您可以序列化對象,將其作爲varchar傳遞,並反序列化爲過程中的相應類型。 – canon

+0

+1真!但是,再次,方向是SQL到CLR,我相信請求者正在向C#請求SQL。我想現在他/他有很多需要閱讀並選擇最合適的選項。 :-)爲什麼我喜歡這個網站。 –

2

如果你可以表達在XML的層次,那麼你可以把它作爲一個XML數據類型到您的存儲過程。然後proc可以使用XPath等讀取XML。

相關問題