Как вставить значение базы данных или строку в тело письма - PullRequest
0 голосов
/ 29 октября 2018

Я хочу вставить содержимое базы данных в тело сообщения электронной почты, индекс 0 считывателя данных, который содержит идентификационный номер для каждого адреса электронной почты. Я хочу отправить письмо, используя добавочный номер идентификатора в теле сообщения, например: Идентификатор сотрудника равен 5. Мне нужно вставить каждый идентификатор в каждом теле письма, которые существуют в той же строке. Я использовал этот код для вставки идентификатора в тело, но это не сработало

message.Body = "The Employee id is 5  "+reader[1].ToString();

Полный код:

MailMessage message = new MailMessage();
message.Subject = "Employee Access ";

message.From = new MailAddress("avvv@gmail.com");
var fromAddress = "avvv@gmail.com";
const string fromPassword="password";
var smtp = new System.Net.Mail.SmtpClient();
{
    smtp.Host = "smtp.gmail.com";
    smtp.EnableSsl = true;
    smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    smtp.Timeout = 20000;


    OleDbCommand cmd = null;
    OleDbCommand cmd2 = null;

    string queryString = "select id,email,status from tableemail";
    using (OleDbConnection connection = new OleDbConnection("Provider = OraOLEDB.Oracle.1; Data Source = xe;
    Password=654321;User ID = xpress; unicode=true"))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        cmd = new OleDbCommand(queryString);
        cmd.Connection = connection;
        OleDbDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            MailAddress to = new MailAddress(reader[1].ToString());
            message.To.Add(to);   
        }

        message.Body = "The Employee id is 5  "+reader[1].ToString();
        smtp.Send(message);
        reader.Close();
    }
}

Могу ли я вставить несколько полей базы данных в тело, используя считыватель данных?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я думаю, проблема в том, что вы вызываете DataReader после того, как он прочитал последнюю запись. Reader.Read () вернул false, что означает, что reader[1] должно выдать ошибку, поскольку читать нечего.

Я не знаю, хотели ли вы каждое значение в теле письма или только последнее ... при условии, что вы хотите каждое, должно работать что-то вроде этого:

using (OleDbConnection connection = new OleDbConnection(cs))
{
    connection.Open();

    using (OleDbCommand cmd = new OleDbCommand(queryString, connection))
    {
        using (OleDbDataReader reader = cmd.ExecuteReader())
        {
            StringBuilder body = new StringBuilder();

            while (reader.Read())
            {
                string to = reader.GetString(0);
                message.To.Add(to);
                body.AppendFormat("The Employee id is 5 {0}<br>", to);
            }

            message.Body = body.ToString();
            reader.Close();
        }
    }
}
smtp.Send(message);

Если вам действительно нужен только последний (как предполагает ваш исходный код), я бы просто сохранил его в локальной строке внутри цикла, а затем добавил его после цикла чтения.

В несвязанном вопросе вы дважды создаете экземпляр объекта OLE Command. Я удалил дубликат в фрагменте кода выше.

0 голосов
/ 29 октября 2018

Я не уверен, как именно ваш код нуждался в этой функции, однако, насколько я понимаю, вы можете сделать это примерно так. используя DataTable

    DataTable dataTable = new DataTable();
    MailMessage message = new MailMessage();
    message.Subject = "Employee Access ";

    message.From = new MailAddress("avvv@gmail.com");
    var fromAddress = "avvv@gmail.com";
    const string fromPassword = "password";


    OleDbCommand cmd = null;

    string queryString = "select id,email,status from tableemail";
    using (OleDbConnection connection = new OleDbConnection("Provider = OraOLEDB.Oracle.1; Data Source = xe; Password = 654321; User ID = xpress; unicode = true"))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        cmd = new OleDbCommand(queryString);
        cmd.Connection = connection;
        OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
        adapter.Fill(dataTable);
        adapter.Dispose();
    }

    foreach (DataRow dataRow in dataTable.Rows)
    {
        var smtp = new System.Net.Mail.SmtpClient();
        {
            smtp.Host = "smtp.gmail.com";
            smtp.EnableSsl = true;
            smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
            smtp.Timeout = 20000;

            MailAddress to = new MailAddress(dataRow[1].ToString());

            if (!message.To.Contains(to))
            {
                    message.To.Add(to);
            }

            message.Body = "The Employee id is 5  " + dataRow[0].ToString();
            smtp.Send(message);
        }
    }
...