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
0
投稿
猜你喜欢
- 一,cookie和session的区别cookie在客户的浏览器上,session存在服务器上cookie是不安全的,且有失效时间sessi
- 如何用ADO批量更新记录?是的,ADO有这项功能,不过好像用的人不太多(不了解还是不会用呢?):<HTML> &nbs
- 有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令。1、二者区
- 目录需求分析进一步分析再进一步分析代码实现我们在写爬虫的过程中,除了研究反爬之外,几乎全部的时间都在写解析逻辑。那么,生命苦短,为什么我们不
- 12-24小时制编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。输入格式:输入在一行中给出带有中间的:符号(半角的冒号
- 1. 换源地址# 中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-
- 1.创建虚拟环境首先创建一个新文件夹在PyCharm终端中切换到这个文件夹,输入 python -m venv 环境名 创建虚拟环境&nbs
- 自己写了玩的一个小脚本,百度图片下载import reimport osimport requestsimport hashlibdef d
- 在小飞的博客上看到他写了一篇关于reset.css的文章,文章中关于css的部分分析的非常不错,但对于文中关于强调把CSS分别配置,对每一个
- xml.etree.ElementTree可以通过支持的有限的XPath表达式来定位元素。语法ElementTree支持的语法如下:语法说明
- 如何开始 C#学习过程中有一集讲的是如何查看类图,看完视频后自己就学习如何在VS 2019中查看类图,但是找了好长时间都没有找到查看类图这
- 如果您刚刚开始接触网页设计,是不是经常发生这样的问题呢?做好的网页在自己机器上可以正常浏览,而把页面传到服务器上就总是出现看不到图片,css
- 本文实例总结了php处理json格式数据的方法。分享给大家供大家参考,具体如下:1.json简介:何为json?简 单地说,JSON 可以将
- 本文实例讲述了python根据出生日期获得年龄的方法。分享给大家供大家参考。具体如下:这段代码可以根据用户的出生日期获得其年龄,born参数
- (一) 常用的CSS命名规则:头:header内容:content/container尾:footer导航:nav侧栏:sidebar栏目:
- UTC与DSTUTC可以视为一个世界统一的时间,以原子时为基础,其他时区的时间都是在这个基础上增加或减少的,比如中国的时区就为UTC+8。D
- xlsxwriter 简介用于以 Excel 2007+ XLSX 文件格式编写文件,相较之下 PhpSpreadsheet 支持更多的格式
- 1. os.listdir()概述os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。例如:dir ='
- 1 、创建一个django项目使用django-admin.py startproject MyDjangoSite 参考这里2、建立视图f
- text函数的功能是向数据点添加文本说明。语法text(x,y,txt)text(x,y,z,txt)text(___,Name,Value