溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL Server數(shù)據(jù)庫中表名稱、字段比較的示例分析

發(fā)布時(shí)間:2021-08-23 14:42:16 來源:億速云 閱讀:151 作者:小新 欄目:數(shù)據(jù)庫

這篇文章主要為大家展示了“SQL Server數(shù)據(jù)庫中表名稱、字段比較的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SQL Server數(shù)據(jù)庫中表名稱、字段比較的示例分析”這篇文章吧。

前言

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

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

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

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

  。。。。。

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

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

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

 }
}

測試結(jié)果

SQL Server數(shù)據(jù)庫中表名稱、字段比較的示例分析

以上是“SQL Server數(shù)據(jù)庫中表名稱、字段比較的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI