讀取數據庫信息構建視圖字段的備注信息,方便程序代碼生成

在很多情況下,我們開發都需要有一個快速的代碼生成工具用來提高開發效率,代碼生成工具很多信息都是讀取數據庫的表、視圖等元數據進行對象表信息的完善,有了這些信息,我們就可以在普通的實體類代碼里面添加屬性字段的中文注釋,或者在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,根據上述介紹的邏輯關系,自動從表對應的字段里面去匹配對應的備注信息,從而減少手工設置視圖字段備注信息的繁瑣工作,為視圖代碼生成和界面生成提高了速度和效率。

以上的視圖備注信息的提取邏輯,我們可以把它應用在自己的業務處理里面,實現更加廣泛的應用。

以上視圖備注信息的提取需求,來自一個客戶的建議,非常不錯,在此感謝他為這個細節做出的貢獻。

本文轉自博客園伍華聰的博客,原文鏈接:讀取數據庫信息構建視圖字段的備注信息,方便程序代碼生成,如需轉載請自行聯系原博主。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256091.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256091.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256091.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu DNS bind9 配置

下面的配置就是實現解析test.zp.com到不同的IP地址 安裝dns server軟件包$ apt-get install bind9 配置dns配置文件的路徑在/etc/bind路徑下面添加一個zone$ /etc/bind# vim /etc/bind/named.conf.local 添加下面,語法可以參照/etc/bind/zones.rfc1918中的語法添加&…

微博分享錯誤

昨天再做這塊的時候,不知怎么的點擊之后什么反應都沒有,程序也沒有崩,日志倒是輸出了這個錯誤 解決辦法:打開你寫分享的代碼跟API文檔對比一下創建文本、圖片或者網頁的時候是不是少寫了那個屬性,我這里是在創建網頁的…

C++總結筆記(十二)—— 智能指針

文章目錄前言一、智能指針是什么?二、示例總結前言 C對于內存管理的要求很高,如果不及時釋放對象內存,就可能會發生內存泄露或野指針等情況,鑒于這種情況,C11提出了智能指針的概念。 一、智能指針是什么?…

代碼生成工具之界面快速生成

界面開發,無論對于Web開發,還是Winform開發,都需要耗費一定的時間,特別對于一個數據庫字段比較多的界面,一般就需要在編輯界面上擺的更多的控件來做數據顯示,每次碰到這個,都有點頭痛&#xff0…

javascript - 封裝原生js實現ajax

1 /*2 * ajax方法3 */4 var Ajax function() {5 var that this;6 //創建異步請求對象方法7 that.createXHR function() {8 if(window.XMLHttpRequ…

QT對象樹、信號和槽機制

文章目錄一 、對象樹是什么?二、信號和槽的基本概念2.1 信號2.2 槽2.3 松散耦合2.4 特點三、示例總結一 、對象樹是什么? 對象樹是由父類和若干子類對象組成,而子類也可以由若干孫類。 QT中的對象樹是以QObject為起始父類來完成樹的構建的&a…

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路:將兩個有序的子列表歸并為一個有序的大列表 #歸并函數,假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中,每當進入一個新的業務項目,從零開始搭建一套前端項目結構是一件讓人頭疼的事情,就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝,可以統一將…

如何使用ATS提高應用的安全性

App Transport Security,簡短的說就是ATS,是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 此文未本人工作中的總結,特此總結。 異常場景: 網絡異常,服務器異常,接口異常或參考參數篡改,斷電,…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么? NMS(non maximum suppression)即非極大值抑制,廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序,復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷,如果前面的元素已經是排序好的,那就不需要再進行比較了,減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中,我們將了解不同的事件,ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器(對于 ASP.NET 應用程序,通常為 IIS)發送請求為起點,直至將請求結果返回至瀏覽器結束。在這個過程中,首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP(Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串(Longest CommonSubstring)和最長公共子序列(LongestCommon Subsequence, LCS)的區別:子串(Substring)是串的一個連續的部分,子序列(Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個:①重新定義了一塊空間用于存儲數據;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中,程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的: public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣,是一種擬合數據的算法。區別在于mls是局部的,即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合,需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的,采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…