ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用 C# 和 SQL Server 构建一个自动化解决方案

利用 C# 和 SQL Server 构建一个自动化解决方案

投稿 Linux操作系统 作者:ecclw459 时间:2026-01-07 19:29:39 0 删除 编辑
  • 开发工具:Visual Studio(C#)
  • 数据库:SQL Server
  • NuGet 包:
    • OpenPop.NET:用于通过 POP3 协议读取邮件
    • System.Data.SqlClient:用于数据库连接和操作

2.2 配置设置

系统配置存储在 web.config 文件中,包含邮件服务器连接信息:

<appSettings>
  <add key="HostServer" value="pop.gmail.com" />
  <add key="MailPort" value="995" />
  <add key="MailUser" value="your-email@gmail.com" />
  <add key="MailPwd" value="your-password" /></appSettings>

此配置允许灵活更改邮件服务器设置而无需修改代码。

3. 邮件处理核心代码实现

3.1 读取邮件功能

以下 C# 代码实现了从邮件服务器读取并处理目标邮件的功能:

public void ReadTheDataFromTheMail(){    try
    {        string mailHost = ConfigurationManager.AppSettings["HostServer"];        int mailPort = Convert.ToInt32(ConfigurationManager.AppSettings["MailPort"]);        string mailID = ConfigurationManager.AppSettings["MailUser"];        string mailPwd = ConfigurationManager.AppSettings["MailPwd"];        using (Pop3Client client = new Pop3Client())
        {
            client.Connect(mailHost, mailPort, true);
            client.Authenticate(mailID, mailPwd);            int messageCount = client.GetMessageCount();
            DateTime today = DateTime.UtcNow.Date;            for (int i = messageCount; i > 0; i--)
            {
                MessageHeader headers = client.GetMessageHeaders(i);                string subject = headers.Subject;
                DateTime emailDate = headers.DateSent;                if (!string.IsNullOrEmpty(subject) && subject.Contains("AllotmentsFiles") && emailDate.Date == today)
                {
                    OpenPop.Mime.Message message =nav.euakj.com client.GetMessage(i);                    foreach (var attachment in message.FindAllAttachments())
                    {                        if (attachment.FileName.Contains("AllotmentsFiles_") && attachment.FileName.EndsWith(".csv"))
                        {                            string baseDirectory = @"E:\Allotment - Applns\Allotmentfiles";                            string dateFolder = DateTime.Now.ToString("yyyy-MM-dd");                            string fileFolder = Path.Combine(baseDirectory, dateFolder);                            if (!Directory.Exists(fileFolder))
                                Directory.CreateDirectory(fileFolder);                            string filePath = Path.Combine(fileFolder, attachment.FileName);
                            File.WriteAllBytes(filePath, attachment.Body);
                            errorlog($"CSV file '{attachment.FileName}'", "Downloaded successfully!");
                            ProcessAllotmentData(filePath);
                        }
                    }
                }
            }
        }
    }    catch (Exception ex)
    {
        errorlog("Error reading emails", ex.Message);
    }
}

这段代码实现了以下功能:

  1. 从配置读取邮件服务器连接信息
  2. 使用 POP3 连接到邮件服务器
  3. 筛选当天且主题包含"AllotmentsFiles"的邮件
  4. 下载符合条件的 CSV 附件并保存到按日期组织的文件夹中
  5. 调用数据处理方法处理下载的附件

4. CSV数据处理与数据库更新

4.1 数据处理流程

下载的 CSV 文件需要被解析并更新到数据库中,以下是实现代码:

public void ProcessAllotmentData(string filePath){    try
    {        string fileName = Path.GetFileName(filePath);        string[] parts = fileName.Split('_');        string scriptName = parts.Length > 0 ? parts[0] : null;        using (StreamReader sr = new StreamReader(filePath))
        {            string[] rows = sr.ReadToEnd().Split('\n');            for (int i = 1; i < rows.Length; i++)
            {                string[] rowValues = rows[i].Split(',');                if (rowValues.Length > 7)
                {                    string appNo = rowValues[2].Trim();                    string pan = rowValues[4].Trim();                    string qty = rowValues[5].Trim();                    string clientName = rowValues[6].Trim();                    string reason = rowValues[7].Trim();
                    SqlParameter[] param = {                        new SqlParameter("@symbol", scriptName),                        new SqlParameter("@appno", appNo),                        new SqlParameter("@pan", pan),                        new SqlParameter("@qty", qty),                        new SqlParameter("@reason", reason)
                    };                    string statusQuery =soccer.dj.zuq8.info @"SELECT * FROM bidfiledetails  (NOLOCK)
                                           WHERE AppNo=@appno AND Symbol=@symbol AND PanNo=@pan AND AllotmentFlag != 'Y'";
                    DataSet ds = SqlHelper.ExecuteDataset(SqlCon, CommandType.Text, statusQuery, param);                    if (ds.Tables[0].Rows.Count > 0)
                    {                        string updateQuery = @"UPDATE bidfiledetails
                                               SET AllotmentFlag='Y', SharesAlloted=@qty, Sharesrej_reason=@reason
                                               WHERE AppNo=@appno AND PanNo=@pan AND Symbol=@symbol";
                        SqlHelper.ExecuteNonQuery(SqlCon, CommandType.Text, updateQuery, param);
                        errorlog("Updated Record", $"PanNo: {pan}, ApplicationNo: {appNo}, Symbol: {scriptName}");
                    }                    else
                    {                        string header = "ApplicationNo|ClientName|Quantity|Reason|PanNo";                        string message = $"{appNo}|{clientName}|{qty}|{reason}|{pan}{Environment.NewLine}";
                        errorlog(header, message);
                    }
                }                else
                {
                    errorlog("Row soccer.yj.zuq8.info  does not have enough columns", "");
                }
            }
        }
    }    catch (Exception ex)
    {
        ExceptionLogging.Exceptionlog("Exception in ProcessAllotmentData", ex.Message);
    }
}

此代码实现了:

  1. 从CSV文件名提取脚本名称
  2. 逐行读取CSV文件内容
  3. 验证数据完整性(确保有足够列数)
  4. 检查数据库中的记录状态
  5. 更新符合条件的记录或记录未匹配的情况
  6. 全面的错误处理和日志记录

5. 关键技术与实现要点

5.1 核心技术组件

  • 邮件处理:使用 OpenPop.NET 库通过 POP3 协议读取邮件
  • 文件处理:系统自动按日期组织下载的附件文件
  • 数据验证:严格检查CSV文件结构和数据完整性
  • 数据库操作:使用参数化查询确保SQL注入防护
  • 错误处理:全面的异常捕获和日志记录机制

5.2 系统部署方式

  • 任务计划程序:配置为每日自动运行的Windows计划任务
  • Windows服务:可转换为服务实现24/7运行
  • 日志监控:通过日志文件监控系统运行状态

6. 系统扩展与优化方向

6.1 功能增强建议

  1. 转换为Windows服务:实现完全自动化的后台处理
  2. 邮件通知功能:在处理完成或出现错误时发送通知邮件
  3. 日志数据库存储:将日志存入SQL表便于历史查询和分析
  4. 重试机制:为失败的邮件下载实现自动重试逻辑

6.2 性能优化建议

  • 实现批量更新操作减少数据库往返
  • 添加并发处理能力提高大量邮件的处理速度
  • 优化内存使用处理超大附件文件


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3107311/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-07

  • 博文量
    108
  • 访问量
    102109