项目目标:
首先是将Access数据库中的大量数据(已经存好的原有百万级数据)转存到mysql数据库中,然后,随着Access中数据的增加,要同步更新mysql数据库,更新周期自定。
思路:一开始的转存前篇博客已经讲过,这里就忽略了,主要是实现Access数据更新后同步到mysql中。思路是:
1.用MAX的sql语句查找mysql数据表,找出时间那一列的最大时间MAX(patrol_time)
2.select出Access数据表中时间大于MAX(patrol_time)的数据,用datareader存到reader里面
3.用分列的方式,将读出来最大时间大于MAX(patrol_time)的数据从reader中存储到数组中
4.建立循环,将数组中的数按照对应写入mysql中
5.将以上逻辑写入死循环,设置循环执行的时间间隔
思路清楚了,下面直接上代码,没有什么难的不能理解的地方:
using System;逻辑上和代码上都是用的比较基础和简单的方法实现的,由于时间间隔比较长,所以不用考虑大量循环的性能问题,就直接用的数组来存和写。
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using MySql.Data;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Data.OleDb;
using System.Drawing;
using System.Threading;
namespace 。。。。。。
{
class Program
{
static void Main(string[] args)
{
while (true)
{
//读出mysql数据库中已有数据的最大时间
string connstrMysql = ConfigurationManager.AppSettings["connstr"];
MySqlConnection connMysql = new MySqlConnection(connstrMysql);
connMysql.Open();
Console.WriteLine("打开Mysql数据库成功");
string sql = "select MAX(mysql时间列) from mysql表";
MySqlCommand cmd = new MySqlCommand(sql, connMysql);
string sqlresult = cmd.ExecuteScalar().ToString();
Console.WriteLine(sqlresult);
connMysql.Close();
//读出Access数据库中大于mysql最大时间的数据
string connstrAccess = ConfigurationManager.AppSettings["connectionstring"];
OleDbConnection connAccess = new OleDbConnection(connstrAccess);
connAccess.Open();
Console.WriteLine("打开Access数据库成功");
string sqlaccess = "select * from Access表 where Access时间列>'" + sqlresult + "'order by Access时间列";
//string sqltest = "select MAX(ID) from Access表";
//OleDbCommand accesstestcmd = new OleDbCommand(sqltest, connAccess);
//string accessresult = accesstestcmd.ExecuteScalar().ToString();
//Console.WriteLine("当前最大ID:"+accessresult);
OleDbCommand accesscmd = new OleDbCommand(sqlaccess, connAccess);
OleDbDataReader reader = accesscmd.ExecuteReader();
//将读出的数据存入数组中,按照列名分成11个数组
ArrayList listid = new ArrayList();
ArrayList listnumberId = new ArrayList();
ArrayList listperson = new ArrayList();
ArrayList listlocation = new ArrayList();
ArrayList listpartoltime = new ArrayList();
ArrayList listnameAttrib = new ArrayList();
ArrayList listitemname = new ArrayList();
ArrayList listitemvalue = new ArrayList();
ArrayList listnumber = new ArrayList();
ArrayList listplantime = new ArrayList();
ArrayList listequipment = new ArrayList();
while (reader.Read())
{
listid.Add(reader["ID"].ToString());
listnumberId.Add(reader["nh"].ToString());
listperson.Add(reader["ry"].ToString());
listlocation.Add(reader["dd"].ToString());
listpartoltime.Add(reader["xjsj"].ToString());
listnameAttrib.Add(reader["bhsx"].ToString());
listitemname.Add(reader["sj"].ToString());
listitemvalue.Add(reader["sjsz"].ToString());
listnumber.Add(reader["bh"].ToString());
listplantime.Add(reader["jhmc"].ToString());
listequipment.Add(reader["sblb"].ToString());
}
//判断是否有新数据需要插入
if (reader.HasRows == false)
{
Console.WriteLine("暂时无数据更新.");
connAccess.Close();
}
else
{
//将存入数组的数据插入Mysql中
Console.WriteLine("存在更新数据,开始更新");
connMysql.Open();
for (int i = 0; i < listid.Count; i++)
{
string sqlInsert = String.Format("INSERT INTO mysql表(id,numberId,person,location,patrol_time,numAtrrib,item_name,item_value,number,plan_name,equipment)" +
"VALUES " +
"({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}');", listid[i], listnumberId[i], listperson[i], listlocation[i], listpartoltime[i], listnameAttrib[i], listitemname[i], listitemvalue[i], listnumber[i], listplantime[i], listequipment[i]);
MySqlCommand cmdInsert = new MySqlCommand(sqlInsert, connMysql);
cmdInsert.ExecuteNonQuery();
Console.WriteLine(sqlInsert);
}
Console.WriteLine("更新完毕");
connMysql.Close();
}
connAccess.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
Thread.Sleep(432000000);
Console.ReadLine();
}
}
}
}
其实稍微有点技术含量的地方就是,如何判定是否有新增加的数据。这一块儿,核心代码是这几句:
string sql = "select MAX(patrol_time) from patrol_records";以及:
MySqlCommand cmd = new MySqlCommand(sql, connMysql);
string sqlresult = cmd.ExecuteScalar().ToString();
Console.WriteLine("打开Access数据库成功");注意用大于号来比较的时候,单双引号的使用,因为原数据要求的时间列是用的varchar类型,所以在sql语句里,要加上单引号''
string sqlaccess = "select * from lwmain where xjsj>'" + sqlresult + "'order by xjsj";