| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 472 人关注过本帖
标题:SQL Sever数据库单向同步工具——暑假写来练手的,给提点建议吧。
只看楼主 加入收藏
zghnxzdcx
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:550
专家分:1176
注 册:2010-4-6
收藏
 问题点数:0 回复次数:0 
SQL Sever数据库单向同步工具——暑假写来练手的,给提点建议吧。
程序代码:
using System;
using System.Collections.Generic;
using  System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DatabaseSynchronization
{
    public partial class DatabaseSynchronizatoin : Form
    {
       
        public DatabaseSynchronizatoin()
        {
            InitializeComponent();
        }
        int count=0;
        private string ConnString(TextBox txtServerName, TextBox txtdbName, TextBox txtUserName, TextBox txtPassword)
          //数据库连接字符串的构造函数
        {
            string ServerName = txtServerName.Text;
            string dbName = txtdbName.Text;
            string UserName = txtUserName.Text;
            string Password = txtPassword.Text;
            string ConnectionString = "data source =" + ServerName + ";initial catalog=" + dbName
                                      + ";user id=" + UserName + ";password=" + Password + ";";
            return ConnectionString;
        }
        private bool CheckConnection(SqlConnection conn)//数据库连接检测函数
        {
           
            try
            {
                conn.Open();
                conn.Close();
                return true;

            }
            catch
            {
                return false;
            }
              
        }
        private void DeleteRecorders(SqlConnection conn, string tablename)//删除数据表中的数据
        {
            conn.Open();
            SqlCommand cmddeleterecorders=conn.CreateCommand();
             = "Delete from " + tablename;
            cmddeleterecorders.ExecuteNonQuery();
            cmddeleterecorders.Dispose();
            conn.Close();
        }
        private void DatabaseMain()//数据同步实现的过程
        {
            string connstr1 = ConnString(txtSourceSeverName, txtSourcedbName, txtSourceUserName, txtSourcePassword); 
            //源数据库的连接字符串
            string connstr2 = ConnString(txtAimServerName, txtAimdbName, txtAimUserName, txtAimPassword);
            //目标数据库的链接字符串
            if (connstr1 == connstr2)
            {
                MessageBox.Show("目标数据库与源数据库不能是同一数据库!");
                return;
            }
            SqlConnection conn1 = new SqlConnection(connstr1);   //源数据库的数据链接
            SqlConnection conn2 = new SqlConnection(connstr2);   //目标数据库的数据链接
            if (!CheckConnection(conn1)) { lblzhishi.Text="连接失败!"; this.Show(); return; }//检测源数据库连接
            if (!CheckConnection(conn2)) { lblzhishi.Text = "连接失败"; this.Show(); return; }//检测目标数据库连接
            lblzhishi.Text = "连接成功!"; //数据库连接成功的提示

            

            DataSet ds = new DataSet();
            //下面开始获取表名与表的个数
            string selectext = "select name from sysobjects  where xtype='u' order by id desc";
            conn2.Open();        
            SqlDataAdapter datablenames = new SqlDataAdapter(selectext, conn2);
            datablenames.Fill(ds,"tablenames");
            datablenames.Dispose();
            conn2.Close();
            int max_tablecount=ds.Tables["tablenames"].Rows.Count;
            //数据库中数据表的个数,数据验证MessageBox.Show(max_tablecount.ToString());
           
            for (int tablecount = 0; tablecount < max_tablecount; tablecount++)//遍历所有数据表
            {
                string tablename = ds.Tables["tablenames"].Rows[tablecount][0].ToString();
                 //取出当前数据表表名 MessageBox.Show(tablename);
                if (tablename == "dtproperties") { continue; }
                DeleteRecorders(conn2,tablename);
                string selectrecorders = "select * from " + tablename;
                conn1.Open();
                SqlDataAdapter darecorders = new SqlDataAdapter(selectrecorders, conn1);
                darecorders.Fill(ds,tablename);
                darecorders.Dispose();
                conn1.Close();
                int max_colid=ds.Tables[tablename].Columns.Count;
                 //当前表的列数,数据验证MessageBox.Show(max_colid.ToString(),tablename);
                int max_rowid = ds.Tables[tablename].Rows.Count;
                //当前表的记录数,数据验证MessageBox.Show(max_rowid.ToString(),tablename);
                for (int rowcount=0; rowcount < max_rowid; rowcount++)//遍历当前表中所有的记录
                {
                     string insertrecorder = " insert into "+ tablename+"(";
                     for (int colcount = 0; colcount < max_colid; colcount++)//将列名写入数据插入命令
                     {
                         string colname = ds.Tables[tablename].Columns[colcount].ColumnName;
                        //取得当前列列名
                         insertrecorder += colname+",";
                         string checktable = "SELECT COLUMNPROPERTY(object_id('"+tablename+"'),'"+colname+"','IsIdentity')";
                         conn1.Open();
                         SqlDataAdapter dachecktable = new SqlDataAdapter(checktable,conn1);
                         dachecktable.Fill(ds,"check"+tablename);
                         dachecktable.Dispose();
                         conn1.Close();
                         if(Convert.ToBoolean(Convert.ToInt32(ds.Tables["check"+tablename].Rows[0][0].ToString())))
                         {
                             if (insertrecorder.Substring(0, 3) != "set")
                             {
                                 insertrecorder = "set identity_insert " + tablename + " on " + insertrecorder;
                             }
                         }  
                     }
                     insertrecorder = insertrecorder.Substring(0, insertrecorder.Length - 1);
                     insertrecorder += ") values" + "(";
                     for (int colcount = 0; colcount < max_colid; colcount++)//将列值写入命令
                     {
                         if (ds.Tables[tablename].Rows[rowcount][colcount].ToString().Replace('\'', ' ').Trim() == "Null")
                         {
                             ds.Tables[tablename].Rows[rowcount][colcount] = null;
                         }
                         //string ceshi = ds.Tables[tablename].Rows[rowcount][colcount].GetType().ToString();
                         if (ds.Tables[tablename].Rows[rowcount][colcount].GetType().ToString() == "System.Decimal")
                         {
                             insertrecorder = insertrecorder + ds.Tables[tablename].Rows[rowcount][colcount].ToString().Trim() + ",";
                         }
                         else
                         {
                             insertrecorder = insertrecorder + " \'" + ds.Tables[tablename].Rows[rowcount][colcount].ToString().Trim() + "',";
                         }
                     }
                     insertrecorder = insertrecorder.Substring(0,insertrecorder.Length-1);
                     insertrecorder += ")";//MessageBox.Show(insertrecorder);
                     conn2.Open();
                     SqlCommand cmdinset = conn2.CreateCommand();
                      = insertrecorder;
                     cmdinset.ExecuteNonQuery();
                     cmdinset.Dispose();
                     conn2.Close();

                }
            }
            conn1.Dispose();
            conn2.Dispose();
            count++;
            lblzhishi1.Visible = true;
            lblzhishi2.Visible = true;
            lblzhishi2.Text = count.ToString();
            lblzhishi3.Visible = true;
            lblzhishi.Visible = false;
        }

        private void btnDataExchange_Click(object sender, EventArgs e)
        {
            DatabaseMain();
            int operatorIndex=cbbtime.SelectedIndex;

            if (txttime.Text=="")
            {
                MessageBox.Show("请设置同步周期!");
                return;
            }
            int tongbutime=Convert.ToInt32(txttime.Text);
            switch (operatorIndex)
            {
                case 0:
                    tongbutime *= 1000 * 60 * 60 * 24 * 7;
                    break;
                case 1:
                    tongbutime *= 1000 * 60 * 60 * 24;
                    break;
                case 2:
                    tongbutime *= 1000 * 60 * 60;
                    break;
                case 3:
                    tongbutime *= (1000 * 60);
                    break;
                case 4:
                    tongbutime *= 1000;
                    break;
                case -1:
                    MessageBox.Show("请设置同步周期!");
                    tongbutime = 1;
                    return;
            }
            timer.Interval = tongbutime;
            timer.Enabled = true;
            btnzuixiaohua.Enabled = true;
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            DatabaseMain();
        }
        private void btnEnd_Click(object sender, EventArgs e)
        {
            timer.Enabled = false;
            lblzhishi.Text = "用户终止同步";
            lblzhishi.Visible = true;
            lblzhishi1.Visible = false;
            lblzhishi2.Visible = false;
            lblzhishi3.Visible = false;
        }
        private void btnzuixiaohua_Click(object sender, EventArgs e)
        {
            this.Hide();
            nfiDatabase.Visible = true;
        }
        private void nfiDatabase_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Show();
            nfiDatabase.Visible = false;
        }

       
    }
}


这是项目代码

[ 本帖最后由 zghnxzdcx 于 2010-9-24 12:49 编辑 ]
搜索更多相关主题的帖子: 数据库 
2010-09-20 17:31
快速回复:SQL Sever数据库单向同步工具——暑假写来练手的,给提点建议吧。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027272 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved