项目中一般分测试环境(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; } }
}

测试结果

SQlServer 数据库表名称,字段比较的更多相关文章

  1. sqlserver数据库 表中字段值有空格,如何去除空格(例如char (5) 存入数据不足5位时sqlserver会自动补空格)

    普通的空格 前后的空格,使用LTrim和RTrim即可,例如:LTrim(RTrim(Name)) 中间的空格,使用replace函数替换,例如:Replace(Name,' ','') 如果是普通的 ...

  2. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

  3. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  4. SQLSERVER数据库表各种同步技术

    1 --SQLSERVER数据库表各种同步技术 减少SQLServer中每次的同步数据量 2 3 --说到数据库,我就不由地想到同步数据,如何尽可能地减少每次的同步数据量,以此来提高同步效率,降低对网 ...

  5. 关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题

    关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题,解决方法如下:在数据库连接字串中,增加一个参数:Metadata Pooling=false如“Data Sour ...

  6. Yii2给数据库表添加字段后对应模型无法识别到该属性的原因和解决办法

    Yii2给数据库表添加字段后对应模型无法识别到该属性的原因和解决办法 应为数据库表的结构被缓存了.删除runtime文件夹或者执行 //清理指定表结构缓存数据 Yii::$app->db-> ...

  7. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  8. SqlServer数据库表导入SqlLite数据库表保持日期时间类型字段的格式

    在写查询功能的过程中遇到一个这样的问题:按日期范围查询,sql语句是:where dt>=用户选择起始日期&&dt<=用户选择结束日期.数据库中的数据如图1,我选择的测试数 ...

  9. ruby数据库表添加字段、修改字段类型、修改字段名称

    Rails 手册 3.8 使用 change 方法 1.为表添加字段 rails g migration add_column_to_d_groups_equip_num class AddColum ...

随机推荐

  1. Redis(六)--- Redis过期策略与内存淘汰机制

    1.简述 关于Redis键的过期策略,首先要了解两种时间的区别,生存时间和过期时间: 生存时间:一段时长,如30秒.6000毫秒,设置键的生存时间就是设置这个键可以存在多长时间,命令有两个 expir ...

  2. SparkStreaming对接rabbitMQ

    /** * SparkStreaming对接rabbitmq java代码 */public class SparkConsumerRabbit { public static void main(S ...

  3. 【iOS】arc4random() 产生随机数

    通过 arc4random() 获取 0 到 x-1 之间的整数的代码如下: int value = arc4random() % x; 获取 1 到 x 之间的整数的代码如下: ; PS: 这里用到 ...

  4. 使用vsftp与shell实现对进程与服务状态的监控

    先说一下需求吧,公司开发了一款新的产品,新产品嘛,有着不得不出问题的理由,四个云机房,总共三百余台机器,需要实时的监控进程状态,虽然有zabbix来实现,但领导需求是脚本和zabbix一起做,zabb ...

  5. 【Spring源码解析】—— 委派模式的理解和使用

    一.什么是委派模式 委派模式,是指什么呢?从字面含义理解,委派就是委托安排的意思,委派模式就是在做具体某件事情的过程中,交给其他人来做,这个事件就是在我的完整链路上的一部分,但是复杂度较高的情况下或者 ...

  6. OLE--SWT高级控件

    OLE和ActiveX控件的支持    OLE(Object Link Embeded)是指在程序之间链接和嵌入对象数据.通过OLE技术可以在一个应用程序中执行其他的应用程序.    而ActiveX ...

  7. mysql新建用户及授权

    添加用户 CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; -- username : 自定义用户名 -- localhost ...

  8. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  9. 算法与数据结构基础 - 二叉查找树(Binary Search Tree)

    二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...

  10. VS调试时修改代码

    最近碰到一个问题,就是vs在调试模式下无法修改代码之后再继续,这种严重影响工作效率的问题怎么能忍,所以决心把这个坑填满.网上搜了大堆有头无尾有尾无头的答案,我一个一个试了几乎都没啥用.最后通过不断的测 ...