C#调用存储过程输出到控制台,如何写入文本/Excel后发送邮件
C# 实现存储过程结果写入文件+邮件发送方案
第一步:改造原有查询逻辑,收集查询结果
先把原方法中输出到控制台的内容统一收集到列表中,方便后续多场景复用:
private static List<string> GetEnrollmentMessages() { List<string> messages = new List<string>(); using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { using (SqlCommand cmd = new SqlCommand("Enrollments", conn)) { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { // 处理空值避免运行时报错 if (!reader.IsDBNull(reader.GetOrdinal("Message"))) { string message = reader.GetString("Message"); // 可保留原有控制台输出逻辑 Console.WriteLine(message); messages.Add(message); } } conn.Close(); } } return messages; }
第二步:写入文本文件
直接调用.NET内置的File类即可实现,无需引入第三方依赖:
// 自定义文本文件保存路径 string txtPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Enrollments.txt"); // 写入文件,默认采用UTF-8编码 File.WriteAllLines(txtPath, messages);
第三步:写入Excel文件
推荐两种适配不同需求的实现方式:
- 无依赖轻量方案:写入CSV格式,Excel可直接识别打开
string csvPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Enrollments.csv"); // 可自定义CSV表头 List<string> csvContent = new List<string> { "消息内容" }; csvContent.AddRange(messages); File.WriteAllLines(csvPath, csvContent, Encoding.UTF8);
- 生成标准XLSX格式:可引入EPPlus NuGet包实现,示例代码如下:
string xlsxPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Enrollments.xlsx"); using (ExcelPackage package = new ExcelPackage(new FileInfo(xlsxPath))) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("报名记录"); // 写入表头 worksheet.Cells[1, 1].Value = "消息内容"; // 批量写入数据 for (int i = 0; i < messages.Count; i++) { worksheet.Cells[i + 2, 1].Value = messages[i]; } // 自动调整列宽 worksheet.Cells.AutoFitColumns(); package.Save(); }
第四步:发送带附件的邮件
使用.NET内置的SmtpClient实现,需替换为你实际使用的邮箱服务配置:
public static void SendEmailWithAttachment(string attachmentPath) { // 邮件基础配置 string smtpServer = "smtp.你的邮箱服务商.com"; // 比如smtp.qq.com、smtp.163.com int smtpPort = 587; // 多数服务商TLS端口为587,SSL端口为465 string sendEmail = "你的发件邮箱地址"; string sendPassword = "你的邮箱授权码"; // 注意不是邮箱登录密码,是邮箱服务商提供的专属授权码 string receiveEmail = "收件人邮箱地址"; using (MailMessage mail = new MailMessage()) { mail.From = new MailAddress(sendEmail); mail.To.Add(receiveEmail); mail.Subject = "报名记录报表"; mail.Body = "附件为最新的报名记录,请查收。"; // 添加生成的文件作为附件 mail.Attachments.Add(new Attachment(attachmentPath)); using (SmtpClient smtp = new SmtpClient(smtpServer, smtpPort)) { smtp.Credentials = new System.Net.NetworkCredential(sendEmail, sendPassword); smtp.EnableSsl = true; smtp.Send(mail); } } }
整体调用示例
把所有逻辑串起来即可完成完整流程:
static void Main(string[] args) { // 1. 从存储过程查询数据 var messages = GetEnrollmentMessages(); // 2. 写入文件(可任选文本/CSV/XLSX格式) string savePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Enrollments.csv"); List<string> csvContent = new List<string> { "消息内容" }; csvContent.AddRange(messages); File.WriteAllLines(savePath, csvContent, Encoding.UTF8); // 3. 发送带附件的邮件 SendEmailWithAttachment(savePath); }
内容的提问来源于stack exchange,提问作者sherwin
相关产品推荐
相关产品推荐

