在很多情況下,我們開發都需要有一個快速的代碼生成工具用來提高開發效率,代碼生成工具很多信息都是讀取資料庫的表、視圖等元數據進行對象表信息的完善,有了這些信息,我們就可以在普通的實體類代碼裡面添加屬性欄位的中文註釋,或者在Winform或者Web界面的快速生成的時候,可以在查詢框或者界面編輯的時候,充... ...
在很多情況下,我們開發都需要有一個快速的代碼生成工具用來提高開發效率,代碼生成工具很多信息都是讀取資料庫的表、視圖等元數據進行對象表信息的完善,有了這些信息,我們就可以在普通的實體類代碼裡面添加屬性欄位的中文註釋,或者在Winform或者Web界面的快速生成的時候,可以在查詢框或者界面編輯的時候,充當標簽提示等處理信息。但是,一般情況下視圖的備註信息是沒有的,但是視圖和表之間是存在一定的關係的,雖然不同資料庫系統對於它們的信息對應不一定一致,但是我們可以把它們的對應關係尋找出來就可以給視圖欄位增加備註了,這個就是本文介紹的思路和做法了,本篇結合介紹代碼生成工具Databae2Sharp的處理實現進行講解如何獲取視圖中欄位對應的備註信息。
1、SQLServer資料庫的視圖信息處理
我們為了演示視圖的處理,我們需要創建兩個表,以及視圖的信息,首先我們創建一個客戶信息表,如下所示。
我們希望這個T_Customer表中的Creator欄位和用戶表進行關聯,然後我們添加一個視圖,其中的視圖代碼如下所示。
SELECT dbo.T_Customer.ID, dbo.T_Customer.Name, dbo.T_Customer.Age, dbo.T_Customer.Creator, dbo.T_Customer.CreateTime, dbo.Users.UserName FROM dbo.T_Customer INNER JOIN dbo.Users ON dbo.T_Customer.Creator = dbo.Users.ID
也就是列出T_Customer的欄位,以及一個Users表中的Username欄位,相當於關聯了兩個表的視圖,獲取這個表的數據如下所示。
好了,到這裡我們基本就準備好前提條件了,剩下的就是如何獲取這些視圖的信息了。
在SQLServer裡面,我們如果需要獲取用戶視圖的信息,那麼通過系統的視圖就可以獲取到了,如下所示。
這個就是視圖的名稱和視圖SQL代碼了,我們如果需要詳細獲取視圖的欄位信息,這些還不夠,我們可以根據視圖信息進一步列出用戶視圖和具體表的關係,如下所示。
從上圖我們就可以看出這個視圖欄位和表的欄位的一一對應關係了,也就是可以通過具體表的欄位信息,包括我們這裡非常關註的備註信息了。
例如根據這些原理,我們視圖就直接從資料庫表欄位中提取備註信息了,從而實現視圖備註欄位的自動提取,減少人工設置的繁瑣和不便。
2、Oracle資料庫視圖信息的處理
在Oracle裡面的視圖欄位信息處理,和SQLServer有所不同,因為我們很難找到視圖欄位和表欄位的一一對應關係的視圖信息,因此有點困難。
在Oracle裡面我們先準備好一個T_Customer表,以及視圖等基礎信息先。
同時創建一個視圖和用戶表發生關聯,和在SQLServer一樣的做法,SQL如下所示。
create or replace view view_customer as select u.fullname, t.id, t.name, t.age, t.creator, t.createtime from t_customer t inner join t_acl_user u on t.creator = u.id;
我們通過Oracle的系統視圖ALL_TAB_COLUMNS或者DBA_TAB_COLUMNS可以獲得視圖的欄位信息,如下所示。
不過很不幸,這個視圖的信息沒有和視圖關聯表發生任何的交集,無法獲取到對應的表信息,那麼如何獲取視圖對應表的信息呢,答案是可以通過ALL_DEPENDENCIES這個視圖進行獲取,如下圖所示。
但是這裡也只是獲取到對應的表,沒有和欄位關聯,不過這樣基本上也差不多了,因為我們可以獲得視圖欄位,以及這個視圖裡麵包含的關聯表,那麼基本上它的欄位信息也大致鎖定了,除非兩個表之間很多欄位名稱相同,難以處理。
結合下麵的SQL,我們可以獲得表和欄位的信息了,如下所示。
select distinct table_name, column_name from all_tab_columns where table_name in (select referenced_name from all_dependencies where name='VIEW_CUSTOMER' and type = 'VIEW' and referenced_type = 'TABLE') and column_name in (select column_name from all_tab_columns where table_name='VIEW_CUSTOMER') order by table_name;
這樣我們根據視圖對應表的欄位信息,匹配它的備註信息就差不多了,最後我們來看看基於Oracle的實現效果。
從上圖我們可以看到,代碼工具Database2Sharp,根據上述介紹的邏輯關係,自動從表對應的欄位裡面去匹配對應的備註信息,從而減少手工設置視圖欄位備註信息的繁瑣工作,為視圖代碼生成和界面生成提高了速度和效率。
以上的視圖備註信息的提取邏輯,我們可以把它應用在自己的業務處理裡面,實現更加廣泛的應用。
以上視圖備註信息的提取需求,來自一個客戶的建議,非常不錯,在此感謝他為這個細節做出的貢獻。