共計 3700 個字符,預計需要花費 10 分鐘才能閱讀完成。
這篇文章主要介紹“SQL Server 數據庫中的表名稱和字段實例分析”的相關知識,丸趣 TV 小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SQL Server 數據庫中的表名稱和字段實例分析”文章能幫助大家解決問題。
前言
項目中一般分測試環境(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; } }}
關于“SQL Server 數據庫中的表名稱和字段實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注丸趣 TV 行業資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。