SQL Server数据库中的表名称、字段比较
作者:春秋一梦 发布时间:2024-01-13 17:02:24
标签:sqlserver,表名称,字段
前言
项目中一般分测试环境(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; }
}
}
测试结果
来源:https://www.cnblogs.com/kim-meng/p/11477474.html


猜你喜欢
- 废话不多说了,直接给大家贴代码了,具体代码如下所述: var aLi = document.querySelectorAll('.a
- 鼠标双击滚动屏幕,单击停止滚动,很多小说新闻网站都有这个很人性化的功能,阅读起小说、新闻来很方便,不用手动拉滚动条。js代码如下:<h
- 今天开始学习 YUI,加强一下对 JavaScript 的理解。1. 命名空间 YAHOO
- 使用python爬虫其实就是方便,它会有各种工具类供你来使用,很方便。Java不可以吗?也可以,使用httpclient工具、还有一个大神写
- 一、实验目的(1)熟练使用Counter类进行统计(2)掌握pandas中的cut方法进行分类(3)掌握matplotlib第三方库,能熟练
- 我就废话不多说了,大家还是直接看代码吧~/** 二分幂法 求x^n */// 求整数幂package mainimport (
- 下面的例子将结合项目实际运用来使用Jquery.TreeView,当然在使用控件树需要现在相应的js文件 下面就把我生成的TreeView展
- 前言在日常开发中,我们往往会将 JSON 解析成对应的结构体,反之也会将结构体转成 JSON。接下来本文会通过 JSON 包的两个函数,来介
- 环境git : 2+前言最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间; 现在记录下; 情况是这样的,一个同事自己的本地分
- 本文实例为大家分享了python实现汉诺塔游戏的具体代码,供大家参考,具体内容如下一.汉诺塔汉诺塔问题是一个经典的递归问题,对于这个问题,我
- 私有变量表示方法在变量前加上两个下划线的是私有变量。class Teacher(): def __init__(self,nam
- 本文实例讲述了JavaScript中String.prototype用法。分享给大家供大家参考。具体如下:// 返回字符的长度,一个中文算2
- argparse 是 python 的一个命令行解析包,可根据需要编写高可读性的程序。网上的许多教程较为冗长和散漫,没有达到精练好掌握的目的
- 本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下模块导入import numpy as npimport ga
- 基于底层数据来开发不难,无非是将用户输入变量作为筛选条件,将参数映射到 sql 语句,并生成一个 sql 语句然后再去数据库执行最后再利用
- Python的第一个主流打包格式是.egg文件,现在大家庭中又有了一个叫做Wheel(*.whl)的新成员。wheel“被设计成包含PEP
- 本文实例讲述了vue多次循环操作。分享给大家供大家参考,具体如下:需求:有以下一个数组,想将其对象里的信息展示出来,而且还要把对象下面的数组
- 简单的测试用例#!/usr/bin/python# -*- coding: UTF-8 -*-import timefrom pymongo
- 如下所示:import numpy as npa = np.array([[1,2,3],[4,5,6],[7,8,9]])b = np.a
- 效果图:代码如下:<html><head><title>颜色变换</title><st