需求
窗体设计:
代码实现:
Main_Forn
using FileRead.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace FileRead
{
public partial class Main_Form : Form
{
public Main_Form()
{
InitializeComponent();
}
private DataTable dt = new DataTable();//数据表
/// <summary>
/// 文件是否存在
/// </summary>
private bool isExits = false;
/// <summary>
/// 是否正在上传
/// </summary>
private bool isUpload = false;
private string path = @"D:\数据存储";//文件路径
private string filePath = "";//文件路径
/// <summary>
/// 设置控件样式
/// </summary>
private void SetStyle()
{
btn_Upload.BackColor = Color.FromArgb(143, 188, 139);
}
/// <summary>
/// 减少窗体闪烁
/// </summary>
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
/// <summary>
/// 配置文件 假如文件夹被删除
/// </summary>
private void SetFilePath()
{
Directory.CreateDirectory(path);
}
/// <summary>
/// 运行信息
/// </summary>
/// <param name="text"></param>
private void WriteLogs(string text)
{
this.Invoke(new Action(() =>
{
if (richB_Logs.Text.Length > 500)
{
richB_Logs.Clear();
}
richB_Logs.AppendText(text+"\r\n");
}));
}
/// <summary>
/// 获取最新文件
/// </summary>
private FileTimeInfo GetLatestFileTimeInfo()
{
List<FileTimeInfo> list = new List<FileTimeInfo>();
DirectoryInfo dr = new DirectoryInfo(path);
foreach (FileInfo file in dr.GetFiles())
{
if (file.Extension.ToUpper() == ".CSV")
{
list.Add(new FileTimeInfo()
{
FileName = file.FullName,
FileCreateTime = file.CreationTime
});
}
}
var f = from x in list
orderby x.FileCreateTime
select x;
return f.LastOrDefault();
}
private void Main_Form_Load(object sender, EventArgs e)
{
Task.Run(() =>
{
this.Invoke(new Action(() =>
{
SetStyle();
SetFilePath();
}));
while (true)
{
this.Invoke(new Action(() =>
{
try
{
if (!isUpload)
{
FileTimeInfo f = GetLatestFileTimeInfo();
if (f == null)
{
isExits = false;
WriteLogs("未检测到文件");
btn_Upload.Enabled = false;
dgv_Infos.DataSource = null;
}
else
{
btn_Upload.Enabled = true;
isExits = true;
filePath = f.FileName;//文件路径
//读取文件
ReadCSV(filePath, out dt);
dgv_Infos.DataSource = dt;
}
}
}
catch (Exception ex)
{
isExits = false;
btn_Upload.Enabled = false;
dgv_Infos.DataSource = null;
WriteLogs(ex.Message);
}
}));
Task.Delay(700).Wait();
}
});
}
private void btn_Upload_Click(object sender, EventArgs e)
{
if (isExits)//文件存在
{
btn_Upload.Enabled = false;
Task.Run(() =>
{
TranslationHelper daltran = new TranslationHelper();//实例化封装好的事务类的TransactionDal
int erro = 0;
daltran.BeginTransaction();
isUpload = true;
for (int i = 0; i < dt.Rows.Count; i++)
{
string location = dt.Rows[i]["Location"].ToString();
string left = float.Parse(dt.Rows[i]["LeftAngle"].ToString()).ToString("0.0");
string right = float.Parse(dt.Rows[i]["RightAngle"].ToString()).ToString("0.0");
string avgAngle = float.Parse(dt.Rows[i]["AvgAngle"].ToString()).ToString("0.0");
string testdate = DateTime.Parse(dt.Rows[i]["Testdate"].ToString()).ToString("yyyy-MM-dd HH:mm:ss.fff");
string testresult = dt.Rows[i]["Testresult"].ToString();
try
{
string sql = $"insert into plasmatestlist(Location,LeftAngle,RightAngle,AvgAngle,Testdate,Testresult) values('{location}','{left}','{right}','{avgAngle}','{testdate}','{testresult}')";
int mod = SqlHelper.ExcuteNonQuery(daltran.transaction, sql, null);
if (mod > 0)//添加成功
{
//WriteLogs("文件上传成功!");
}
else
{
//WriteLogs("文件上传失败!");
erro += 1;
daltran.RollbackTrasaction();
break;
}
}
catch (Exception ex)
{
WriteLogs("文件上传失败!");
erro += 1;
daltran.RollbackTrasaction();
}
}
if (erro==0)
{
//删除文件
if (File.Exists(filePath))
{
File.Delete(filePath);
}
MessageBox.Show("文件上传成功!");
daltran.CommitTransaction();//成功
}
daltran.DisposeTrasaction();//释放锁
isUpload = false;
this.Invoke(new Action(() =>
{
btn_Upload.Enabled = true;
}));
});
}
else
{
MessageBox.Show("无文件,禁止上传!");
}
}
/// <summary>
/// 读取文件数据
/// </summary>
/// <param name="path"></param>
/// <param name="data"></param>
private void ReadCSV(string path, out DataTable data)
{
StreamReader sr;
data = new DataTable();
data.Columns.Add("Location");
data.Columns.Add("LeftAngle");
data.Columns.Add("RightAngle");
data.Columns.Add("AvgAngle");
data.Columns.Add("Testresult");
data.Columns.Add("Testdate");
try
{
using (sr = new StreamReader(path, Encoding.GetEncoding("GB2312")))
{
string str = "";
int i = 0;
while ((str = sr.ReadLine()) != null)
{
if (i == 0)
{
i += 1;
continue;
}
string[] val = str.Split(',');
DataRow drs = data.NewRow();
drs["Location"] = val[0];
drs["LeftAngle"] = val[1];
drs["RightAngle"] = val[2];
drs["AvgAngle"] = val[3];
drs["Testdate"] = val[4];
drs["Testresult"] = val[5];
data.Rows.Add(drs);
}
}
}
catch (Exception ex)
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName.ToUpper().Equals("EXCEL"))
process.Kill();
}
GC.Collect();
Thread.Sleep(10);
Console.WriteLine(ex.StackTrace);
using (sr = new StreamReader(path, Encoding.GetEncoding("GB2312")))
{
string str = "";
int i = 0;
while ((str = sr.ReadLine()) != null)
{
if (i == 0)
{
i += 1;
continue;
}
string[] val = str.Split(',');
DataRow drs = data.NewRow();
drs["Location"] = val[0];
drs["LeftAngle"] = val[1];
drs["RightAngle"] = val[2];
drs["AvgAngle"] = val[3];
drs["Testdate"] = val[4];
drs["Testresult"] = val[5];
data.Rows.Add(drs);
}
}
}
}
private void Main_Form_FormClosing(object sender, FormClosingEventArgs e)
{
this.Dispose();
this.Close();
Environment.Exit(0);
}
private void btn_clear_Click(object sender, EventArgs e)
{
richB_Logs.Clear();
}
}
}
FileTimeInfo.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FileRead.Models
{
//定义一个类包含要使用的字段
public class FileTimeInfo
{
public string FileName; //文件名
public DateTime FileCreateTime; //创建时间
}
}
SQLHelper.cs
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace FileRead.Models
{
public class SqlHelper
{
private static readonly string connStr= ConfigurationManager.AppSettings["mysql"].ToString();
/// <summary>
/// 有锁的事务方法
/// </summary>
/// <param name="tran">事务</param>
/// <param name="sql">sql语句</param>
/// <param name="pms">sql语句或存储过程</param>
/// <returns></returns>
public static int ExcuteNonQuery(IDbTransaction tran, string sql, params MySqlParameter[] pms)
{
using (MySqlCommand cmd = new MySqlCommand(sql, (MySqlConnection)tran.Connection, (MySqlTransaction)tran))
{
if (pms != null)
{
cmd.Parameters.AddRange(pms);
}
return cmd.ExecuteNonQuery();
}
}
protected static MySqlConnection Createconnection()
{
MySqlConnection conn = new MySqlConnection(connStr);
return conn;
}
}
}
TanslationHelper.cs:
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FileRead.Models
{
public class TranslationHelper:SqlHelper
{
public MySqlConnection connect = null;
public MySqlTransaction transaction = null;
public void BeginTransaction()
{
connect = Createconnection(); //创建连接对象
connect.Open();
transaction = connect.BeginTransaction(); //开始事务
}
/// <summary>
/// 提交事务
/// </summary>
public void CommitTransaction()
{
if (transaction != null)
{
transaction.Commit(); // 提交事务
}
}
/// <summary>
/// 回滚事务
/// </summary>
public void RollbackTrasaction()
{
if (transaction != null)
{
transaction.Rollback(); //回滚
}
}
/// <summary>
/// 释放事务
/// </summary>
public void DisposeTrasaction()
{
if (connect.State == ConnectionState.Open)
{
connect.Close();
}
if (transaction != null)
{
transaction.Dispose();
}
}
}
}