ab56a9bcf7
SVN-Revision: r240
419 lines
18 KiB
C#
419 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Data.SqlClient;
|
|
|
|
namespace Lskj_SynchronizeData
|
|
{
|
|
public partial class FrMain : Form
|
|
{
|
|
public string Connection1 = "QkYyNjE3QTcxQjc4RDFFMDlERjlFMDc1QkIyMDVGRjdDRUIyMEVEOUM5NjBCQjc5NTA5NzdEQTk0MkNEQTE1RTFGMEIwMThFNUJDQTE0RjE1NjQwM0U5QTYxMThCMDY2MTA4NkE2OTIxNTNBQjQ0MjRDMDIwM0Q5OEVDQjkwQTVCN0RENjJBODkxNUNGOUM5OEI5RTEzN0E3ODBERjg2OURCNEQ5QTlCMzhCQUZGQ0FBNUREMjY4M0FCODg2RTkxMDRERTQ3MjRGQTE1MERDOTJGRDFDRjY2REQ1ODYyREUzN0RGM0ZBQzc4NzJENjIwNDg4RUUyNkI3ODE1RjlDM0I0MjNCQzcyOENDN0VDMTg0QUU0MjgwMDVDMENBOUZF";
|
|
/// <summary>
|
|
/// 远程数据库名
|
|
/// </summary>
|
|
public string DataBase = "lskj_weixin";
|
|
/// <summary>
|
|
/// 远程服务器名
|
|
/// </summary>
|
|
private string serverName = "114.116.152.217,14331";
|
|
/// <summary>
|
|
/// 本地数据库名
|
|
/// </summary>
|
|
private string localDBName;
|
|
/// <summary>
|
|
/// 本地服务器名
|
|
/// </summary>
|
|
private string localServer;
|
|
/// <summary>
|
|
/// 数据库远程连接字符串
|
|
/// </summary>
|
|
string connStr;
|
|
/// <summary>
|
|
/// 数据库本地连接字符串
|
|
/// </summary>
|
|
string localconnStr;
|
|
private System.Timers.Timer timer = new System.Timers.Timer();
|
|
private DataTable localDt;
|
|
|
|
public FrMain()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:初始化</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-07 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="item">The item.</param>
|
|
protected override void OnLoad(EventArgs e) {
|
|
//设置timer
|
|
timer.Interval = 1000*60;
|
|
//设置是否重复计时,如果该属性设为False,则只执行timer_Elapsed方法一次。
|
|
timer.AutoReset = true;
|
|
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
|
|
bool localConn = DBConfig.Instance.CreateConnection();
|
|
bool romoteConn = CreateConnection();
|
|
}
|
|
|
|
#region 事件相关
|
|
|
|
/// <summary>
|
|
/// <para>说明:开始按钮点击</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void OnStartClick(object sender, EventArgs e)
|
|
{
|
|
timer.Enabled = true;
|
|
this.txt_log.Text = "";
|
|
RefreshLog(DateTime.Now + ":定时器启动中,请稍后\r\n");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 显示信息设置
|
|
/// </summary>
|
|
/// <param name="msg"></param>
|
|
public void RefreshLog(string msg)
|
|
{
|
|
Invoke((EventHandler)delegate
|
|
{
|
|
this.txt_log.Text += msg;
|
|
this.txt_log.Focus();//获取焦点
|
|
this.txt_log.Select(this.txt_log.TextLength, 0);//光标定位到文本最后
|
|
this.txt_log.ScrollToCaret();//滚动到光标处
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:暂停按钮点击</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void OnSuspendClick(object sender, EventArgs e)
|
|
{
|
|
timer.Enabled = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:初始化表按钮点击</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void OnInitTable(object sender, EventArgs e)
|
|
{
|
|
string createSql;
|
|
if (DBConfig.Instance.CreateConnection()) {
|
|
localconnStr = DBConfig.Instance.GetConnection();
|
|
string sqlValue = string.Format("select count(1) as result from sys.objects where name = 'P_SystemMSGSendTab'");
|
|
string sqlValue1 = string.Format("select count(1) as result from sys.objects where name = 'P_SystemMSGSendListTab'");
|
|
|
|
try {
|
|
if (SqlHelper.ExecuteDataTable(sqlValue).Rows[0]["result"] + "" != "1")
|
|
{
|
|
createSql = "CREATE TABLE P_SystemMSGSendTab(id int IDENTITY(1,1) NOT NULL,msgID bigint NULL,ClientCode varchar(50) NULL,OpenID varchar(50) NULL,MsgInfo varchar(500) NULL,MsgLink varchar(max) NULL,CreateTime datetime NULL,SendTime datetime NULL,SendStatus int NULL,StatusMsg varchar(150) NULL,msgType varchar(50) NULL,msg_first varchar(500) NULL,msg_keyword1 [varchar](300) NULL,msg_keyword2 varchar(300) NULL,msg_keyword3 varchar(300) NULL,msg_keyword4 varchar(300) NULL, msg_keyword5 varchar(300) NULL,msg_remark varchar(500) NULL,isSync int NULL, PRIMARY KEY CLUSTERED (id ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]";
|
|
if (SqlHelper.ExecuteNonQuery(createSql) > 0)
|
|
{
|
|
MessageBox.Show("表P_SystemMSGSendTab创建成功");
|
|
}
|
|
}
|
|
if (SqlHelper.ExecuteDataTable(sqlValue1).Rows[0]["result"] + "" != "1")
|
|
{
|
|
createSql = "CREATE TABLE P_SystemMSGSendListTab(id int IDENTITY(1,1) NOT NULL,msgID bigint NULL,ClientCode varchar(50) NULL,OpenID varchar(50) NULL,MsgInfo varchar(500) NULL,MsgLink varchar(max) NULL,CreateTime datetime NULL,SendTime datetime NULL,SendStatus int NULL,StatusMsg varchar(150) NULL,msgType varchar(50) NULL,msg_first varchar(500) NULL,msg_keyword1 [varchar](300) NULL,msg_keyword2 varchar(300) NULL,msg_keyword3 varchar(300) NULL,msg_keyword4 varchar(300) NULL, msg_keyword5 varchar(300) NULL,msg_remark varchar(500) NULL,isSync int NULL, PRIMARY KEY CLUSTERED (id ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]";
|
|
if (SqlHelper.ExecuteNonQuery(createSql) > 0)
|
|
{
|
|
MessageBox.Show("表P_SystemMSGSendListTab创建成功");
|
|
}
|
|
}
|
|
}
|
|
catch(Exception ex) {
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:定时器事件</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
|
{
|
|
if (this.txt_log.Lines.Count() > 1000)
|
|
{
|
|
this.txt_log.Text = "";
|
|
}
|
|
SynchronizeData();
|
|
timer.Enabled = true;
|
|
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// <para>说明:同步数据</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <param name="sender">The sender.</param>
|
|
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
|
|
private void SynchronizeData() {
|
|
timer.Enabled = false;
|
|
string sqlValue = string.Empty;
|
|
string result = string.Empty;
|
|
RefreshLog(DateTime.Now + ":准备插入数据\r\n");
|
|
//本地数据库连接
|
|
try
|
|
{
|
|
if (DBConfig.Instance.CreateConnection())
|
|
{
|
|
//MessageBox.Show("本地数据库连接成功");
|
|
localDBName = DBConfig.Instance.DataBase;
|
|
localServer = DBConfig.Instance.ServerName;
|
|
localconnStr = DBConfig.Instance.GetConnection();
|
|
sqlValue = string.Format("select count(1) as result from sys.objects where name = 'P_SystemMSGSendTab'");
|
|
result = SqlHelper.ExecuteDataTable(sqlValue).Rows[0]["result"] + "";
|
|
if (result == "1")
|
|
{
|
|
//判断字段是否存在
|
|
string existSql = "select count(1) as result from syscolumns where id=object_id('P_SystemMSGSendTab') and name='isSync'";
|
|
result = SqlHelper.ExecuteDataTable(existSql).Rows[0]["result"] + "";
|
|
if (result != "1")
|
|
{
|
|
string alterSql = "alter table P_SystemMSGSendTab add isSync bit not null default 0";
|
|
SqlHelper.ExecuteNonQuery(alterSql);
|
|
}
|
|
localDt = SqlHelper.ExecuteDataTable("select * from P_SystemMSGSendTab where isSync=0");
|
|
}
|
|
else
|
|
{
|
|
RefreshLog(DateTime.Now + ":当前数据库没有对应表\r\n");
|
|
timer.Enabled = false;
|
|
}
|
|
}
|
|
}
|
|
catch(Exception e) {
|
|
MessageBox.Show(e.Message);
|
|
}
|
|
|
|
try
|
|
{
|
|
//远程数据库连接
|
|
if (CreateConnection())
|
|
{
|
|
sqlValue = string.Format("select count(1) as result from sys.objects where name = 'P_SystemMSGSendTab'");
|
|
result = SqlHelper.ExecuteDataTable(sqlValue).Rows[0]["result"] + "";
|
|
if (result == "1" && localDt.Rows.Count > 0)
|
|
{
|
|
//RefreshLog(DateTime.Now + ":数据插入中\r\n");
|
|
WriteDataToDB(localDt, "P_SystemMSGSendTab");
|
|
}
|
|
else
|
|
{
|
|
RefreshLog(DateTime.Now + ":没有要插入的数据\r\n");
|
|
}
|
|
}
|
|
else {
|
|
RefreshLog(DateTime.Now + ":远程数据库连接失败\r\n");
|
|
}
|
|
//timer.Enabled = true;
|
|
}
|
|
catch(Exception ex) {
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:创建数据库连接</para>
|
|
/// <para>创建人:钱雄</para>
|
|
/// <para>创建日期:2020-11-27 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
|
public bool CreateConnection()
|
|
{
|
|
connStr = GetConnection();
|
|
if (SqlHelper._connection != null)
|
|
{
|
|
try
|
|
{
|
|
SqlHelper._connection.Close();
|
|
SqlHelper._connection.Dispose();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
}
|
|
SqlHelper._connection = null;
|
|
}
|
|
try
|
|
{
|
|
SqlHelper._connection = new SqlConnection(connStr);
|
|
SqlHelper._connection.Open();
|
|
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// <para>说明:获取C#连接字符串</para>
|
|
/// <para>创建人:龚宇超</para>
|
|
/// <para>创建日期:2017-08-07 </para>
|
|
/// <para>修改人:</para>
|
|
/// <para>修改日期:</para>
|
|
/// <para>修改备注:</para>
|
|
/// <para>版本:1.0</para>
|
|
/// </summary>
|
|
/// <returns>System.String.</returns>
|
|
public string GetConnection()
|
|
{
|
|
return string.Format(AESUtil.Decrypt(Connection1), serverName, DataBase);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 将DataTable中数据写入数据库中
|
|
/// </summary>
|
|
/// <param name="dt"></param>
|
|
/// <returns></returns>
|
|
public bool WriteDataToDB(DataTable dt, string tableName)
|
|
{
|
|
if (dt == null || dt.Rows.Count == 0)
|
|
{
|
|
return true;
|
|
}
|
|
string colNames = "";
|
|
|
|
for (int i = 0; i < dt.Columns.Count; i++)
|
|
{
|
|
if ((i == 0) || (i == dt.Columns.Count - 1)) continue;
|
|
colNames += dt.Columns[i].ColumnName + ",";
|
|
}
|
|
colNames = colNames.TrimEnd(',');
|
|
string cmd = "";
|
|
string colValues;
|
|
int count = 0;
|
|
string ids = string.Empty;
|
|
//string cmdmode = string.Format("insert into {0}({1}) values({{0}});", tableName, colNames);
|
|
string cmdmode = string.Format("insert into OPENDATASOURCE('SQLOLEDB','{0}').{1}.dbo.{2} ({3}) values({{0}});", connStr, DataBase, tableName, colNames);
|
|
for (int i = 0; i < dt.Rows.Count; i++)
|
|
{
|
|
ids += dt.Rows[i][0] + ",";
|
|
//bool isSync;
|
|
colValues = "";
|
|
//isSync = string.IsNullOrEmpty(dt.Rows[i][dt.Columns.Count - 1] + "") ? false : Convert.ToBoolean(dt.Rows[i][dt.Columns.Count - 1]);
|
|
//if (!isSync) {
|
|
for (int j = 0; j < dt.Columns.Count; j++)
|
|
{
|
|
count++;
|
|
if (j == 0 || j == dt.Columns.Count - 1) continue;
|
|
if (dt.Rows[i][j].GetType() == typeof(DBNull))
|
|
{
|
|
colValues += "NULL,";
|
|
continue;
|
|
}
|
|
if (dt.Columns[j].DataType == typeof(string))
|
|
colValues += string.Format("'{0}',", dt.Rows[i][j]);
|
|
else if (dt.Columns[j].DataType == typeof(int) || dt.Columns[j].DataType == typeof(float) || dt.Columns[j].DataType == typeof(double))
|
|
{
|
|
colValues += string.Format("{0},", dt.Rows[i][j]);
|
|
}
|
|
else if (dt.Columns[j].DataType == typeof(DateTime))
|
|
{
|
|
colValues += string.Format("cast('{0}' as datetime),", dt.Rows[i][j]);
|
|
}
|
|
else if (dt.Columns[j].DataType == typeof(bool))
|
|
{
|
|
colValues += string.Format("{0},", dt.Rows[i][j].ToString());
|
|
}
|
|
else
|
|
colValues += string.Format("'{0}',", dt.Rows[i][j]);
|
|
}
|
|
cmd += string.Format(cmdmode, colValues.TrimEnd(','));
|
|
//count++;
|
|
//}
|
|
}
|
|
int ret = 0;
|
|
try
|
|
{
|
|
if (count > 0)
|
|
{
|
|
RefreshLog(DateTime.Now + ":数据插入中\r\n");
|
|
ret = SqlHelper.ExecuteNonQuery(cmd);
|
|
RefreshLog(DateTime.Now + ":成功插入" + ret + "条数据\r\n");
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
//写错误日志...
|
|
string strOuput = string.Format("向数据库中写数据失败,错误信息:{0},异常{1}\n", e.Message, e.InnerException);
|
|
RefreshLog(DateTime.Now + strOuput + "\r\n");
|
|
}
|
|
if (ret == -1)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
ids = ids.TrimEnd(',');
|
|
if (count == 0)
|
|
{
|
|
RefreshLog(DateTime.Now + "没有要插入的数据\r\n");
|
|
}
|
|
try
|
|
{
|
|
|
|
string updateValue = string.Format("Update OPENDATASOURCE('SQLOLEDB','{0}').{1}.dbo.P_SystemMSGSendTab set isSync=1 where id in ({2})", localconnStr, localDBName, ids);
|
|
if (DBConfig.Instance.CreateConnection()&&SqlHelper.ExecuteNonQuery(updateValue) > 0) {
|
|
RefreshLog(DateTime.Now + ":本地表字段isSync修改成功\r\n");
|
|
}
|
|
}
|
|
catch(Exception e) {
|
|
RefreshLog(DateTime.Now + ":" + e.Message+"\r\n");
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|