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

          軟件下載吧

          當(dāng)前位置:軟件下載吧 > 數(shù)據(jù)庫(kù) > MS_SQL > SQL Server數(shù)據(jù)庫(kù)中如何比較表名稱、字段

          SQL Server數(shù)據(jù)庫(kù)中如何比較表名稱、字段

          時(shí)間:2024-02-04 13:45作者:下載吧人氣:39

          前言

          項(xiàng)目中一般分測(cè)試環(huán)境(QAS),生產(chǎn)環(huán)境(PRD),當(dāng)我們的項(xiàng)目經(jīng)歷了一次周期跨度較長(zhǎng)的更新后,當(dāng)我們發(fā)布到生產(chǎn)環(huán)境時(shí),首要的任務(wù)是將新增的表,字段更新到生產(chǎn)數(shù)據(jù)庫(kù)。很多時(shí)候,當(dāng)我們發(fā)布更新的時(shí)候,已經(jīng)很難記得做了哪些變更。

          當(dāng)然有的人會(huì)說,1.EF Code First 有history記錄,這是一種辦法,可靠么?不可靠。相信即便是用Code First,直接改數(shù)據(jù)庫(kù)的肯定不止我一個(gè)。

           2.查看實(shí)體類變更記錄,這也是一個(gè)辦法。那如果用的DB First的呢?當(dāng)然也可以看,就是很麻煩。

           3.開發(fā)過程中,對(duì)數(shù)據(jù)庫(kù)的變更記下來。這么做過的肯定也不止我一個(gè)。手動(dòng)狗頭

            。。。。。

          中午的時(shí)候,就想著另外一個(gè)項(xiàng)目下個(gè)月要更新,改了N多的東西,到時(shí)候數(shù)據(jù)庫(kù)咋更新呢。就想著寫個(gè)工具比較兩個(gè)版本數(shù)據(jù)庫(kù),表名稱,字段,字段類型的區(qū)別。

          說干就干(本來想著用EF,DBContext應(yīng)該可以實(shí)現(xiàn),無奈學(xué)藝不精,最終還是回到了ADO.Net)。

          控制臺(tái)應(yīng)用程序,目前只能對(duì)比新增,修改(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; }

          }
          }

          標(biāo)簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫(kù),SQLSERVER

          相關(guān)下載

          查看所有評(píng)論+

          網(wǎng)友評(píng)論

          網(wǎng)友
          您的評(píng)論需要經(jīng)過審核才能顯示

          熱門閱覽

          最新排行

          公眾號(hào)

          主站蜘蛛池模板: 亚洲综合av一区二区三区不卡| 精品亚洲A∨无码一区二区三区| 无码日韩人妻AV一区二区三区 | 中文字幕一区二区三区精彩视频 | 日韩内射美女人妻一区二区三区| 老熟妇仑乱视频一区二区| 精品国产一区二区三区| 末成年女A∨片一区二区| 精品一区二区三区四区在线| 日本精品一区二区三本中文| 亚洲AV成人一区二区三区在线看| 日韩精品无码一区二区三区不卡 | 亚洲av成人一区二区三区在线播放 | 久久婷婷色一区二区三区| 中文字幕无码一区二区三区本日| 一区二区三区视频在线播放| 国产一区中文字幕在线观看| 在线视频亚洲一区| 国产精品资源一区二区| 国产成人一区二区三区精品久久| 精品免费国产一区二区| 日韩精品一区二区三区毛片| 加勒比无码一区二区三区| av一区二区三区人妻少妇| 欧洲亚洲综合一区二区三区| 国产拳头交一区二区| 日本一区中文字幕日本一二三区视频| 精品国产区一区二区三区在线观看 | 免费精品一区二区三区第35| 中文字幕亚洲乱码熟女一区二区| 日韩人妻无码一区二区三区| 国产高清视频一区三区| 亚洲精品一区二区三区四区乱码| 中文字幕乱码亚洲精品一区 | 一区二区三区中文字幕| 中文字幕aⅴ人妻一区二区| 少妇激情一区二区三区视频 | 一区二区三区亚洲视频| 国产麻豆精品一区二区三区v视界| 亚洲AV无码第一区二区三区| 精品国产AV一区二区三区|