一、需求
1、在新项目中添加了新的功能模块,而已上线的旧项目中没有此功能模块,需添加进去。
2、已知新项目模块中新增了三张表 TConsumeAccount TConsumeRecBufDSnew TConsumeAccountSum
旧项目中存在表TConsumeRecBufD,需要将表TConsumeRecBufD中的数据同步到新表TConsumeRecBufDSnew 中去,而新旧表的结构是有出入的。
二、开发步骤
1、工具运行效果如下:
点击“创建表”给就项目添加三张表。在代码中执行如下sql语句进行创建,在建表之前应先进行是否已存在判断,只有当不存在才创建表。如下:
if not exists(select * from sysobjects where xtype='u' and name='TConsumeAccountSum')
CREATE TABLE [dbo].[TConsumeAccountSum](...
点击“加载数据”是将旧表中的数据加载到DataGridView中进行展示,同时,因为两张表中的字段类型和数目都有出入,所以这样可以将旧表的数据临时存储到DataGridView中,然后点击更新数据的时候,就可以遍历DataGridView中数据,进行一定的处理之后再将数据写入新表。
点击“更新按钮”,将进行数据同步,即将表TConsumeRecBufDS中的数据导入到新表TConsumeRecBufDSnew中去。由于需要同步的数据可能比较多,所以这里可以在后台开启一个线程并添加一个progressBar控件避免假死情况的出现。
private void btnUpdate_Click(object sender, EventArgs e)
{
if (isLoadData == false)
{
LoadTableData();
}
Thread t = new Thread(new ThreadStart(Single));
t.IsBackground = true;
t.Start();
}
点击“查看”,可以查看更新后的新表数据。
//查看新表数据
private void btnLook_Click(object sender, EventArgs e)
{
strConn = string.Format("server={0};database={1};uid={2};pwd={3}", txtServerUrl.Text.Trim(), txtDatabase.Text.Trim(), uid, pwd);
SqlHelper helper = new SqlHelper(strConn);
string sql = "select * from TConsumeRecBufDSnew";
dgv.DataSource = helper.GetDataTable(sql,null);
lblRowNums.Text = dgv.Rows.Count.ToString();
}
关键代码如下:
private void Single()
{
TConsumeRecBufDSnew model = null;
List<TConsumeRecBufDSnew> lists = null;
TConsumeRecBufDSnewDAL tDal = new TConsumeRecBufDSnewDAL();
if (loadDT.Rows.Count > 0)
{
lists = new List<TConsumeRecBufDSnew>();
Invoke(new MethodInvoker(delegate { progressBar1.Visible = true; }));
Invoke(new MethodInvoker(delegate { progressBar1.Maximum = loadDT.Rows.Count; }));
for (int i = 0; i < loadDT.Rows.Count; i++)
{
model = new TConsumeRecBufDSnew();
model.PosMac = loadDT.Rows[i]["PosMac"].ToString();
if (loadDT.Rows[i]["Balance"] == null || string.IsNullOrEmpty(loadDT.Rows[i]["Balance"].ToString()))
{
model.Balance = decimal.Round(Convert.ToDecimal(loadDT.Rows[i]["Balance"]), 2);
}
else
{
model.Balance = (decimal)0.00;
}
string str = loadDT.Rows[i]["RecordTime"].ToString();
model.RecordTime = Convert.ToDateTime(str);
model.FareCount = Convert.ToInt32(loadDT.Rows[i]["FareCount"].ToString());
model.Operator = Convert.ToInt32(loadDT.Rows[i]["Operator"].ToString());
model.Mode = loadDT.Rows[i]["Mode"].ToString();
model.IsAllowance = loadDT.Rows[i]["IsAllowance"].ToString();
model.IsCredit = loadDT.Rows[i]["IsCredit"].ToString();
model.IsSuccess = loadDT.Rows[i]["IsSuccess"].ToString();
model.IsReturn = loadDT.Rows[i]["IsReturn"].ToString();
model.LastPosMac = loadDT.Rows[i]["LastPosMac"].ToString();
model.IsReturn = loadDT.Rows[i]["IsReturn"].ToString();
model.Fare = decimal.Parse(loadDT.Rows[i]["Fare"].ToString());
model.CardID = loadDT.Rows[i]["CardID"].ToString(); //
model.RecordID = comm.GetRecordID(loadDT.Rows[i]["RecordID"].ToString()); //
model.ID = model.PosMac + model.CardID + comm.GetHexToInt(model.RecordID); //
model.IsChecked = decimal.Zero;
model.IsTrue = decimal.MinusOne;
model.AccountID = Guid.Empty;
if (model.IsSuccess == "刷卡成功")
{
model.RecordStatus = decimal.One;
}
else
{
model.RecordStatus = decimal.Zero;
}
if (loadDT.Rows[i]["UpdateTime"] != null && !string.IsNullOrEmpty(loadDT.Rows[i]["UpdateTime"].ToString()))
{
model.UpdateTime = Convert.ToDateTime(loadDT.Rows[i]["UpdateTime"]);
}
if (tDal.Exists(model.ID))
{
tDal.Update(model);
}
else
{
tDal.Add(model);
}
Invoke(new MethodInvoker(delegate { progressBar1.Value += 1; }));
//lists.Add(model);
}
}
else
{
MessageBox.Show("请先加载数据!");
}
MessageBox.Show("数据已更新!");
}