SQL Server資料庫中的表名稱、欄位比較
阿新 • • 發佈:2020-01-09
前言
專案中一般分測試環境(QAS),生產環境(PRD),當我們的專案經歷了一次週期跨度較長的更新後,當我們釋出到生產環境時,首要的任務是將新增的表,欄位更新到生產資料庫。很多時候,當我們釋出更新的時候,已經很難記得做了哪些變更。
當然有的人會說,1.EF Code First 有history記錄,這是一種辦法,可靠麼?不可靠。相信即便是用Code First,直接改資料庫的肯定不止我一個。
2.檢視實體類變更記錄,這也是一個辦法。那如果用的DB First的呢?當然也可以看,就是很麻煩。
3.開發過程中,對資料庫的變更記下來。這麼做過的肯定也不止我一個。手動狗頭
。。。。。
中午的時候,就想著另外一個專案下個月要更新,改了N多的東西,到時候資料庫咋更新呢。就想著寫個工具比較兩個版本資料庫,表名稱,欄位,欄位型別的區別。
說幹就幹(本來想著用EF,DBContext應該可以實現,無奈學藝不精,最終還是回到了ADO.Net)。
控制檯應用程式,目前只能對比新增,修改(SQl Server)。
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using Microsoft.EntityFrameworkCore; namespace EFGetTable { class Program { static void Main(string[] args) { string prdconnectionstring = "Data Source=localhost;initial catalog=ttPRD;user id=sa;password=password;MultipleActiveResultSets=True"; var prd = GetTableNames(prdconnectionstring); string qasconnectionstring = "Data Source=localhost;initial catalog=ttqas;user id=sa;password=password;MultipleActiveResultSets=True"; var qas = GetTableNames(qasconnectionstring); CompareTable(prd,qas); } public static List<TableInfo> GetTableNames(string connectionstr) { var tableresult = new List<TableInfo>(); string sqlTableName = "Select * From Information_Schema.Tables"; using (SqlConnection connection = new SqlConnection(connectionstr)) { using (SqlCommand cmd = new SqlCommand(sqlTableName,connection)) { try { connection.Open(); SqlDataReader dr = cmd.ExecuteReader();// while (dr.Read()) { // 表名 TableInfo table = new TableInfo(); table.TableName = dr["Table_Name"].ToString(); table.columns.AddRange(GetColumnNamesByTable(dr["Table_Name"].ToString(),connection)); tableresult.Add(table); } connection.Close(); } catch (System.Data.SqlClient.SqlException e) { Console.ForegroundColor = ConsoleColor.Red; Console.Error.WriteLine(e.Message); connection.Close(); } } return tableresult; } } public static List<CloumnInfo> GetColumnNamesByTable(string tableName,SqlConnection connection) { var Columnresults = new List<CloumnInfo>(); string sqlcolum = $"Select * From Information_Schema.Columns t Where t.Table_Name =\'{tableName}\'"; using (SqlCommand cmd = new SqlCommand(sqlcolum,connection)) { SqlDataReader dr = cmd.ExecuteReader();// while (dr.Read()) { // 表名 CloumnInfo column = new CloumnInfo(); column.CloumnName = dr["Column_name"].ToString(); column.DateType = dr["DATA_TYPE"].ToString() + dr["CHARACTER_MAXIMUM_LENGTH"].ToString(); Columnresults.Add(column); } return Columnresults; } } public static void CompareTable(List<TableInfo> prd,List<TableInfo> qas) { foreach (var p in qas) { var tablequery = prd.AsQueryable().Where(t => t.TableName.Equals(p.TableName)); if (!tablequery.Any()) { Console.WriteLine($"New Created Table {p.TableName}"); continue; } else { var querytable = tablequery.FirstOrDefault(); p.columns.ForEach(c => { var Cloumnquery = querytable.columns.Select(cc => cc.CloumnName).Contains(c.CloumnName); if (!Cloumnquery) { Console.WriteLine($"New add cloumn: {c.CloumnName} on Table {p.TableName}"); } else { var querycloumn = querytable.columns.Where(qt => qt.CloumnName.Equals(c.CloumnName)).FirstOrDefault(); if (!querycloumn.DateType.Equals(c.DateType)) { Console.WriteLine($"DateType Different: cloumn: {c.CloumnName},{querycloumn.DateType}==>{c.DateType} on Table {p.TableName}"); } } }); } } } } public class TableInfo { public TableInfo() { columns = new List<CloumnInfo>(); } public string TableName { get; set; } public List<CloumnInfo> columns { get; set; } } public class CloumnInfo { public string CloumnName { get; set; } public string DateType { get; set; } } }
測試結果
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。