基本上。我有这个项目,我连接数据库中的表并列出我需要的信息。不,我正在尝试发送一个完美的电子邮件。我唯一的问题是在邮件正文中放置控制台应用程序中列出的数据以显示在电子邮件中。以下是我的代码。
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;
using System.Net;
namespace sql_connection
{
class Program
{
static void Main(string[] args)
{
string conn = null;
SqlConnection connection;
conn= ("Data Source=Databse\\SQL2012;Initial Catalog=Data_base;User ID=user;Password=example");
connection = new SqlConnection(conn);
try{
connection.Open();
Console.WriteLine("Connection Open!");
SqlCommand cmd = new SqlCommand("SELECT [Data_base].[dbo].[tb_Work].Date,[Data_base].[dbo].[tb_Work].FromTime,[Data_base].[dbo].[tb_Work].ToTime, [Data_base].[dbo].[tb_Work].User,[Data_base].[dbo].[tb_Login].Email FROM [Data_base].[dbo].[tb_Work]INNER JOIN [Data_base].[dbo].[tb_Login] ON [Data_base].[dbo].[tb_Work].whd_User = [Data_base].[dbo].[tb_Login].Login WHERE DATEDIFF(DAY,[Date],GETDATE())<=7 AND (ToTime = '' OR ToTime IS NULL) AND(User=Login)");
cmd.Connection = connection;
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
Console.WriteLine("{4},{3},{2}, {1}, {0}",
reader["ToTime"] == DBNull.Value? "NULL" : reader["ToTime"].ToString(),
reader["FromTime"] == DBNull.Value? "NULL" : reader["FromTime"].ToString(),
reader["Date"].ToString(),
reader["User"].ToString(),
reader["Email"].ToString());
}
connection.Close();
MailAddress to = new MailAddress("email@gmail.com");
MailAddress from = new MailAddress("email@gmail.com");
MailMessage mail = new MailMessage(from, to);
mail.Subject = ("subject");
mail.Body = (reader["ToTime"] == DBNull.Value? "NULL" : reader["ToTime"].ToString(),
reader["FromTime"] == DBNull.Value? "NULL" : reader["FromTime"].ToString(),
reader["Date"].ToString(),
reader["User"].ToString(),
reader["Email"].ToString());
);
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.Credentials = new NetworkCredential(
"example@gmail.com", "pass");
smtp.EnableSsl = true;
Console.WriteLine("Sending email..");
smtp.Send(mail);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
正如你在Mail.body中看到的那样,我试图再把我放在console.writeline中的内容放到我需要的所有东西上,但由于某种原因它不想工作。
答案 0 :(得分:0)
reader.Read()
应将光标移动到下一条记录。我认为你正在运行的是迭代你所有的项目,然后再次尝试访问它们(假设你期望看到属于最后一项的数据?)。
您可以做的是创建一个包装器对象,该对象具有您从数据库中读取的属性。在下面的区块内:
while(reader.Read())
{
Console.WriteLine("{4},{3},{2}, {1}, {0}",
reader["ToTime"] == DBNull.Value? "NULL" : reader["ToTime"].ToString(),
reader["FromTime"] == DBNull.Value? "NULL" : reader["FromTime"].ToString(),
reader["Date"].ToString(),
reader["User"].ToString(),
reader["Email"].ToString());
}
您可以初始化所述包装器对象并将其放在列表中。您可以覆盖ToString()
方法,以便将其打印到控制台或其他位置。
在您的电子邮件构建部分中,您将遍历您已创建的列表(包含包装器对象的列表),并使用您需要的信息创建电子邮件。
答案 1 :(得分:0)
在一个小小的变化之下:你在while循环之后关闭你的阅读器,通过重新访问它,当它被关闭时,什么都不会改变。
在阅读器打开时填写列表,然后根据列表值创建邮件。
WHERE YEAR(transaction_date)
BETWEEN YEAR('01-01-2010') AND YEAR('09-05-2019')
希望这有帮助
额外: 当您知道数据的顺序时,您还可以使用以下语法:
var list = new List<string>();
while(reader.Read())
{
var s = string.Format("{4},{3},{2}, {1}, {0}",
reader["ToTime"] == DBNull.Value? "NULL" : reader["ToTime"].ToString(),
reader["FromTime"] == DBNull.Value? "NULL" : reader["FromTime"].ToString(),
reader["Date"].ToString(),
reader["User"].ToString(),
reader["Email"].ToString());
Console.WriteLine(s);
list.Add(s);
}
//create a full string of your list.
var sb = new StringBuilder();
foreach(var s in list)
{
sb.AppendLine(s);
}
//set the mail body
mail.Body = sb.ToString();
这使它更具可读性