下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當前位置:軟件下載吧 > 數據庫 > MS_SQL > SQL Server數據庫中如何比較表名稱、字段

          SQL Server數據庫中如何比較表名稱、字段

          時間:2024-02-04 13:45作者:下載吧人氣:24

          前言

          項目中一般分測試環境(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; }

          }
          }

          標簽MSSQL,SQLServer,技術文檔,數據庫,SQLSERVER

          相關下載

          查看所有評論+

          網友評論

          網友
          您的評論需要經過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 91国偷自产一区二区三区| 久久久久人妻一区二区三区vr| 精品无人区一区二区三区| 亚洲国产成人久久一区久久| 亚洲丶国产丶欧美一区二区三区| 人妻少妇AV无码一区二区| 日本精品夜色视频一区二区| 伊人色综合一区二区三区影院视频| 亚洲国产精品一区| 精品国产亚洲一区二区三区| 制服中文字幕一区二区| 人妻少妇精品一区二区三区| 一区二区乱子伦在线播放| 丝袜人妻一区二区三区网站| 在线日韩麻豆一区| 国产不卡视频一区二区三区| 免费国产在线精品一区| 精品亚洲一区二区三区在线观看 | 国产丝袜一区二区三区在线观看| 午夜性色一区二区三区不卡视频 | ...91久久精品一区二区三区| 国产成人久久一区二区三区| 亚洲欧洲一区二区三区| 精品女同一区二区三区免费站| 一区二区视频在线免费观看| 亚洲AV无码一区二区三区牛牛| 国产免费一区二区三区免费视频| 中文乱码人妻系列一区二区| 精品乱人伦一区二区| 久久亚洲日韩精品一区二区三区| 国产精品综合一区二区三区| 人妻体体内射精一区二区| 国产免费一区二区三区VR| 久久国产视频一区| 综合一区自拍亚洲综合图区| 国产精品va无码一区二区| 日韩久久精品一区二区三区| 精品亚洲一区二区| 日韩一区二区三区视频| 寂寞一区在线观看| 黑人一区二区三区中文字幕|