C#同步SQL Server数据库Schema

C#同步SQL Server数据库Schema

1. 先写一个sql加工类:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;

namespace PinkDatabaseSync
{
    class DBUtility : IDisposable
    {
        private string Server;
        private string Database;
        private string Uid;
        private string Password;
        private string connectionStr;
        private SqlConnection sqlConn;

        public void EnsureConnectionIsOpen()
        {
            if (sqlConn == null)
            {
                sqlConn = new SqlConnection(this.connectionStr);
                sqlConn.Open();
            }
            else if (sqlConn.State == ConnectionState.Closed)
            {
                sqlConn.Open();
            }
        }

        public DBUtility(string server, string database, string uid, string password)
        {
            this.Server = server;
            this.Database = database;
            this.Uid = uid;
            this.Password = password;
            this.connectionStr = "Server=" + this.Server + ";Database=" + this.Database + ";User Id=" + this.Uid + ";Password=" + this.Password;
        }

        public int ExecuteNonQueryForMultipleScripts(string sqlStr)
        {
            EnsureConnectionIsOpen();
            SqlCommand cmd = sqlConn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlStr;
            return cmd.ExecuteNonQuery();
        }
        public int ExecuteNonQuery(string sqlStr)
        {
            EnsureConnectionIsOpen();
            SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
            cmd.CommandType = CommandType.Text;
            return cmd.ExecuteNonQuery();
        }

        public object ExecuteScalar(string sqlStr)
        {
            EnsureConnectionIsOpen();
            SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
            cmd.CommandType = CommandType.Text;
            return cmd.ExecuteScalar();
        }

        public DataSet ExecuteDS(string sqlStr)
        {
            DataSet ds = new DataSet();
            EnsureConnectionIsOpen();
            SqlDataAdapter sda= new SqlDataAdapter(sqlStr,sqlConn);
            sda.Fill(ds);
            return ds;
        }

        public void Dispose()
        {
            if (sqlConn != null)
                sqlConn.Close();
        }
    }
}

2. 再写个数据库类型类:

using System;
using System.Collections.Generic;
using System.Text;

namespace PinkDatabaseSync
{
    public class SQLDBSystemType
    {
        public static Dictionary<string, string> systemTypeDict
        {
            get{
            var systemTypeDict = new Dictionary<string, string>();
            systemTypeDict.Add("34", "image");
            systemTypeDict.Add("35", "text");
            systemTypeDict.Add("36", "uniqueidentifier");
            systemTypeDict.Add("40", "date");
            systemTypeDict.Add("41", "time");
            systemTypeDict.Add("42", "datetime2");
            systemTypeDict.Add("43", "datetimeoffset");
            systemTypeDict.Add("48", "tinyint");
            systemTypeDict.Add("52", "smallint");
            systemTypeDict.Add("56", "int");
            systemTypeDict.Add("58", "smalldatetime");
            systemTypeDict.Add("59", "real");
            systemTypeDict.Add("60", "money");
            systemTypeDict.Add("61", "datetime");
            systemTypeDict.Add("62", "float");
            systemTypeDict.Add("98", "sql_variant");
            systemTypeDict.Add("99", "ntext");
            systemTypeDict.Add("104", "bit");
            systemTypeDict.Add("106", "decimal");
            systemTypeDict.Add("108", "numeric");
            systemTypeDict.Add("122", "smallmoney");
            systemTypeDict.Add("127", "bigint");
            systemTypeDict.Add("240-128", "hierarchyid");
            systemTypeDict.Add("240-129", "geometry");
            systemTypeDict.Add("240-130", "geography");
            systemTypeDict.Add("165", "varbinary");
            systemTypeDict.Add("167", "varchar");
            systemTypeDict.Add("173", "binary");
            systemTypeDict.Add("175", "char");
            systemTypeDict.Add("189", "timestamp");
            systemTypeDict.Add("231", "nvarchar");
            systemTypeDict.Add("239", "nchar");
            systemTypeDict.Add("241", "xml");
            systemTypeDict.Add("231-256", "sysname");
            return systemTypeDict;
            }
        }
    }
}

3. 写个同步数据库表结构schema:

public void SyncDBSchema(string server, string dbname, string uid, string password,
            string server2, string dbname2, string uid2, string password2)
        {
            DBUtility db = new DBUtility(server, dbname, uid, password);
            DataSet ds = db.ExecuteDS("SELECT sobjects.name FROM sysobjects sobjects WHERE sobjects.xtype = 'U'");
            DataRowCollection drc = ds.Tables[0].Rows;
            string test = string.Empty;
            string newLine = " ";
            foreach (DataRow dr in drc)
            {
                string tableName = dr[0].ToString();
                test += "if NOT exists (select * from sys.objects where name = '" + tableName + "' and type = 'u')";
                test += "CREATE TABLE [dbo].[" + tableName + "](" + newLine;
                DataSet ds2 = db.ExecuteDS("SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo." + tableName + "')");
                DataRowCollection drc2 = ds2.Tables[0].Rows;
                foreach (DataRow dr2 in drc2)
                {
                    test += "[" + dr2["name"].ToString() + "] ";
                    string typeName = SQLDBSystemType.systemTypeDict[dr2["system_type_id"].ToString()];
                    test += "[" + typeName + "]";
                    string charLength = string.Empty;
                    if (typeName.Contains("char"))
                    {
                        charLength = (Convert.ToInt32(dr2["max_length"].ToString()) / 2).ToString();
                        test += "(" + charLength + ")" + newLine;
                    }
                    bool isIdentity = bool.Parse(dr2["is_identity"].ToString());
                    test += isIdentity ? " IDENTITY(1,1)" : string.Empty;
                    bool isNullAble = bool.Parse(dr2["is_nullable"].ToString());
                    test += (isNullAble ?

" NULL," : " NOT NULL,") + newLine;
                }
                test += "CONSTRAINT [PK_" + tableName + "] PRIMARY KEY CLUSTERED ";
                string primaryKeyName = drc2[0]["name"].ToString();
                test += @"(
                    	[" + primaryKeyName + @"] ASC
                        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
                        ) ON [PRIMARY]" + newLine;
            }

            test = "use [" + dbname2 + "]" + newLine + test;
            DBUtility db2 = new DBUtility(server2, dbname2, uid2, password2);
            db2.ExecuteNonQueryForMultipleScripts(test);
        }

4. 最后运行同步函数:

private void SyncDB_Click(object sender, EventArgs e)
        {
            string server = "localhost";
            string dbname = "testdb1";
            string uid = "sa";
            string password = "password1";
            string server2 = "servername2";
            string dbname2 = "testdb2";
            string uid2 = "sa";
            string password2 = "password2";
            try
            {
                SyncDBSchema(server, dbname, uid, password, server2, dbname2, uid2, password2);
                MessageBox.Show("Done sync db schema successfully!");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }

注: 这仅仅是做个简单的DB schema同步。还能够非常多地方要继续完好,例如,约束。双主密钥。外键等。。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-04 16:54:29

C#同步SQL Server数据库Schema的相关文章

C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text; namespace PinkDatabaseSync { class DBUtility : IDisposable { private string Server; private string

SQL Server数据库镜像关键性能计数器

SQL Server数据库镜像关键性能计数器 监视数据库镜像基本有以下5种方法: 1. 配置数据库镜像监视器.设置告警阈值. 2. 配置WMI EVENT ALERT,配置镜像状态修改后的动作或告警. 3. 使用系统监视器查看关键性能计数器. 4. 部署作业监控异常镜像状态,发送告警. 5. 使用sp_dbmmonitorresults获取镜像数据. 当然,使用扩展事件和SQL Server Profiler也能监控到数据库事件中的数据库镜像状态修改.这种工具主要用于跟踪,而非监控的常规手段.

将SQL SERVER数据库改成MySql

格斗人网 (www.helpqy.com) 架构在阿里云上,最先想采用SQL SERVER,想大家都是微软家族的嘛.但是发现SQL SERVER需要的配置比较高,需要的银子也比较多,最后在纠结之下换成了MySql.由于整个网站基于微软的asp.net MVC架构,同时基于EF6.0,而MVC架构默认采用了SQL SERVER,这里又与code first混合在一起,所以在修改和过渡过程中还是遇到了不少问题.这个过程中参考了博客园不少前辈的文章,真是太感谢了.其中主要参考的一篇外文是:“ASP.N

SQL Server 数据库文件管理

2014年,注定要和数据库打交道,陆续接到的任务都是和数据库管理相关的,某民航系统的数据库优化.某地产企业的数据库高可用.某手机连锁企业的数据库读写分离,某快捷连接企业的数据库迁移,一下子感脚2014怎么了?于是,准备就数据库的管理写几篇文章,今天算是开篇吧. 关于数据库文件的管理问题,我经常说,常在江湖混,哪有不挨棍,用的时间长了,基本上都有遇到一些数据库文件管理上的问题,比如说: 1. SQL Server数据文件空间满 2. 日志文件暴涨 3. 文件不能收缩 4. 如何实现文件的自动增长和

MFC连接SQL Server数据库

C++连接SQL数据库分步骤进行 我们在进行C++连接SQL数据库的操作时,首先应该进行相应的系统配置,然后初始化C++与SQL连接,然后再进行数据连接的操作,然后应用SQL执行语言来具体操作. C++连接SQL数据库第一步 系统配置 1.设置SQLSERVER服务器为SQL登录方式,并且系统安全性中的sa用户要设置登录功能为“启用”,还有必须要有密码. 2.需要在ODBC中进行数据源配置,数据源选\”SQL SERVER”,登录方式使用“使用输入用户登录ID和密码的SQL SERVER验证”,

微软ASP.NET站点部署指南(11):部署SQL Server数据库更新

1. 综述 本章节展示的是如何向完整版SQL Server 数据库部署一个数据库升级.与第9章的数据库升级部署有所不同(第9章是部署到SQL Server Compact数据库). 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2. 给表添加新列 这个小节,做一个数据库修改和相应的代码更新,在部署到测试和生产环境之前,先在Visual Studio 里测试.修改内容是给Instructor 实体添加一个OfficeHour

SQL Server数据库大型应用解决方案总结(转载)

转载地址:http://hb.qq.com/a/20120111/000216.htm 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题. 一.负载均衡技术 负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作.共同负载.均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器.

如何还原SQL Server 数据库到Always On可用性组

问题描述 ============== 如何还原SQL Server 数据库到AlwaysOn可用性组 问题解答 ==============我们无法在一个可用组的数据库上执行还原操作,如果需要的话,我们必须从可用性组中删除数据库然后再还原和重新配置.它与您在镜像或日志传送方案中所使用的类似. 下面是相关的步骤去还原SQL Server数据库到AlwaysOn可用性组 步骤1: 从可用性组中删除数据库 1)在新的主服务器上,扩展可用性组的可用性数据库的列表. 2)右键单击要还原的数据库,然后选择

SQL server数据库的在server 2008R2上的安装及基本管理

         SQL server数据库的在server 2008R2上的安装及基本管理(一) 选择SQL的数据库的镜像文件 双击setup.ext 执行安装程序 这里选择安装项,并选择全新安装 安装的环境监测全部通过 因为这里是使用的破解版的镜像,所以会自动生成密钥 再一次检测安装环境 这里选择第一项 这里选择全部的功能 这里选择默认的实例名 这里将系统的内置账户添加到服务中,NT 这里选择混合式身份 验证,并输入sa的密码.并添加本地的管理员 这里添加本地的管理员账户 选择第一项 开始安