2015-05-13 2 views
0

В принципе. У меня есть этот проект, и я подключаюсь к таблицам из баз данных и спискам, которые мне нужны. Нет. Я пытаюсь отправить электронное письмо, которое отлично работает. Мои единственные проблемы - это то, что положить в тело сообщения данные, перечисленные в консольном приложении, для показа в письме. Ниже мой код.Ввод списка данных из базы данных в электронное письмо

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 protected]"); 


     MailAddress from = new MailAddress("[email protected]"); 

     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(
      "[email protected]", "pass"); 
     smtp.EnableSsl = true; 
     Console.WriteLine("Sending email.."); 
     smtp.Send(mail); 
    } 




    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 





    } 
    } 
} 

Как вы можете видеть в Mail.body я попытался поставить еще раз, что я положил в Console.WriteLine, который сделал все, что нужно показать, но по какой-то причине он не хочет работать.

ответ

0

Под небольшим изменением: вы закрываете своего читателя после цикла while, заново его обрабатывая, ничто не изменится, поскольку к тому времени оно будет закрыто.

Заполните список, пока читатель открыт, а затем создайте свою почту на основе значений списка.

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(); 

Надеется, что это помогает

Extra: Когда вы знаете, в какую последовательность ваших данные приходят, вы можете также использовать следующий синтаксис:

while(reader.Read()) 
{ 
    var s = string.Format("{4},{3},{2}, {1}, {0}", 
       reader.IsDBNull(0) ? "NULL" : reader.GetString(0), 
       reader.IsDBNull(1) ? "NULL" : reader.GetString(1), 
       reader.IsDBNull(2) ? "NULL" : reader.GetString(2), 
       reader.IsDBNull(3) ? "NULL" : reader.GetString(3), 
       reader.IsDBNull(4) ? "NULL" : reader.GetString(4)); 
    Console.WriteLine(s); 
    list.Add(s); 
} 

Это делает его более удобным для чтения

+0

привет, я думаю, что это должно работать единственная проблема в list.add (s) слово add it говорит, что tdoes не содержит определения для добавления – bobby

+0

никогда не работал, просто добавил, начать в столице A – bobby

+0

извините, отредактируйте его – Schuere

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(), чтобы его можно было печатать на консоли или в другом месте.

В своем разделе по строительству электронной почты вы затем перебираете список, который вы создали (тот, который содержит объекты-обертки), и создайте электронное письмо с необходимой информацией.

Смежные вопросы