2012-05-24 33 views
0

我的老闆已經問過我複製一個MS Access功能,我們將產品遷移到.NET後不久就會失去。.NET在SQL視圖中更新數據

該功能可以在表格網格中查看和更新​​數據庫中的任何數據,特別是表或視圖中的數據。

我可以爲具有標識列的純表執行此操作,因爲SqlDataAdapter可以自動生成相關的CRUD方法,以通過DataTable填充/更新。

但是,視圖有點棘手。 SQL Server Management Studio確實允許它。如果您在視圖上單擊「編輯top xx rows」,它可以讓您編輯某些列中的數據,看起來像是一個標準的.NET DataGridView - 雖然感覺有點神奇。

所以,有幾個問題:

如何SSMS推斷其主鍵來使用,即使鑰匙不在看法?

SSMS如何確定視圖中的哪一列可以或不可以被編輯/插入/刪除等?

什麼是我最好的選擇複製這個內部的.NET應用程序?

是否可以將DataGridView連接到與數據庫具有常數直接連接的舊樣式oledb/obdc連接?

任何指導正常將高度讚賞。

馬龍

回答

1

SQL Server視圖可以就好像它們是一個單一的表進行更新,只要它們符合一定的條件。

documentation

可更新視圖

可以通過視圖修改底層基表中的數據,作爲 只要滿足下列條件爲真:

的任何修改包括UPDATE,INSERT和DELETE語句, 必須僅引用來自一個基表的列。

在視圖中修改的列必須直接引用表列中的基礎數據 。的列不能在 導出的任何其他方式,例如通過下列操作:

一個聚集函數:AVG,COUNT,SUM,MIN,MAX,分組,STDEV, STDEVP,VAR,和VARP。

計算。該列無法從 使用其他列的表達式計算。通過使用集合運算符 UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT形成的列等於 計算並且也不可更新。

正在修改的列不受GROUP BY,HAVING或DISTINCT子句的影響。

TOP不在使用WITH CHECK OPTION子句的select_statement視圖中的任何位置使用 。

以前的限制適用於視圖的FROM子句 中的所有子查詢,就像它們適用於視圖本身一樣。通常,數據庫引擎必須能夠明確地將視圖定義中的修改從追蹤定義追蹤到一個基表。有關更多信息,請參閱 通過視圖修改數據。

我不相信SSMS正在做任何特殊的事情 - 編輯視圖的內容提供了與編輯表格內容完全相同的功能。如果用戶嘗試進行不符合上述條件的更改,SSMS可能會顯示錯誤。

SSMS如何推斷使用哪個主鍵,即使該鍵不在視圖中?

它沒有。因爲一次只能編輯一個底層表,所以SQL Server可以。

SSMS如何確定視圖中的哪一列可以或不可以被編輯/插入/刪除等。

再一次,它是SQL Server決定的,而不是SSMS。

什麼是我最好的選擇來複制這個.NET應用程序內?

只要所有的意見符合上述條件,只需做你正在做的表相同,但隨時準備處理來自用戶做一些他們不能錯誤(這意味着一些用戶需要進行培訓,就像他們直接使用SSMS一樣)。

+3

此外,如果視圖不可更新,您可以通過提供一個替代更新觸發器來對其進行縮小處理;)然後可以執行真正的表插入操作。 – TomTom

+0

感謝丹尼爾,沒關係,如果我確實可以讓SQL爲我完成所有工作(這是可取的),但使用普通的.NET,我沒有連接到SQL的連接,所以我需要某種形式的WHERE子句來傳遞以及更新語句以更新視圖中的正確行。將選擇數據與ROW_NUMBER函數一起工作,或者我可以嘗試使用ADODB RecordSet以虛擬模式使用DataGridView,它可以直接編輯數據庫。 – Marlon

+0

您應該使用任何單列或列組合來標識視圖中的行。如果沒有能夠完成這項工作的列的組合(即,視圖可能包含每列中具有相同值的行是可行的),那麼您需要向視圖添加一個新列,該列可用作標識。只要所有基礎表都具有主鍵,視圖也將具有由所有基礎主鍵列的組合構成的主鍵,但所有這些列必須由視圖公開,並且如果視圖具有一些聚合。 –