将SQL查询结果格式化为EMail Body(SMTP)C#控制台应用程序

时间:2018-05-29 18:31:03

标签: c# sql console-application

早上好Stack Overflow,我试图弄清楚如何将SQL查询结果格式化为电子邮件正文。但是有一些捕获 - 我正在使用App.config连接字符串,虽然我只引用一个服务器,但我需要引用7个不同的数据库。为了让事情更加混乱,我将在所有7个DB上运行相同的查询,并希望将结果组合到电子邮件正文中的一个漂亮的小表中。我正在使用类库来发送电子邮件,所以除了如何查询所有7个dbs并将数据组合到同一个表中之外,我几乎已经弄明白了。

我正在使用SMTP,这是一个控制台应用程序。

请注意,这是我在堆栈上发布的第一个问题,我已经对此进行了彻底的研究。我知道它说发布代码但我真的没有为它编写任何代码。我只是需要一个地方开始!我在SQL中比在C#中更有经验,所以如果这是一个基本问题,我道歉。如果您需要有关我的问题的更多信息,请告诉我们!

2 个答案:

答案 0 :(得分:0)

你把几件事弄成一个。

对于初学者:SMTP是一种传输协议,对您的任务无关紧要。 重要的是电子邮件内容的格式。阅读https://en.wikipedia.org/wiki/MIME#Content-Type

之后:你能发送多部分消息吗?你能创建电子邮件的附件吗?或者你只限于短信(html)消息?

  

所以除了如何查询所有7 dbs

外,我几乎已经弄明白了

也许您不需要为此任务编程任何内容。

但这取决于您使用的操作系统以及需要查询的数据库。

案例1 :带有7个连接字符串和7个列表的excel文件(我在10年前就这样做了)

案例2 :您已经(可以获得)访问BI系统,其中许多都具有调度报告功能(这种情况太多了

案例3 :报告用户不需要丰富的BI图形,只需要等待csv文件,之后他们就可以自己处理数据。您需要为db找到dump-tool并编写一个bash / cmd脚本来自动化它并发送带有附件的multipart。

案例4 :案例3中的所有内容,但您可以将结果保存到网络共享/ ftp / sftp / google docs / other并仅发送http-links。

明确您的要求并寻找适合您的工具。 尝试用它们做点什么。

如果遇到新问题 - 请回到新问题。

祝你好运!

答案 1 :(得分:0)

我认为你将从SQL Server中查询所有7个数据库,并且由于你对SQL非常强大,我创建了一个虚拟存储过程,其中所有7个查询将被联合/加入:

CREATE PROCEDURE QueryAllDatabases 
    -- Add the parameters for the stored procedure here
    -- Added some dummy parameters here for future use in your queries.
    @active bit,
    @birthdate date
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    -- QUERY DATABASE-1
    SELECT
        'Hulk Hogan' Name,
        'hh@email.com' Email
    --FROM
        -- DATABASE1.dbo.YourTable
    WHERE
        @active = 1 AND  -- "1" passed from console app.
        @birthdate > '2018-01-01'  -- "2018-05-29" passed from console app.

    UNION ALL

    -- QUERY DATABASE-2
    SELECT
        'Chum Lee' Name,
        'chum@email.com' Email
    --FROM
        -- DATABASE2.dbo.YourTable
    WHERE
        @active = 1 AND
        @birthdate > '2018-01-01'
END
GO

现在来到C#控制台应用程序部分,它将从单个存储过程调用中获取所有7个数据库查询:

Program.cs (这是C#控制台解决方案)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApp_C_Sharp
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessData();
        }

        /// <summary>
        /// Query the database.
        /// </summary>
        /// <returns></returns>
        static DataSet QueryDatabase() 
        {
            // Credentials to your database.
            SqlConnection connection = new SqlConnection(@"Data Source=SERVER-NAME;Initial Catalog=DatabaseName;User ID=user;Password=yourpassword");

            // Name of the stored procedure to be excecuted and connection to database.
            SqlCommand command = new SqlCommand("QueryAllDatabases", connection);

            // DataSet to store the query results.
            DataSet result = new DataSet();

            // To excecute and fill the dataset.
            SqlDataAdapter da = new SqlDataAdapter(command);

            // Set the sqlcommand to "Stored Procedure".
            command.CommandType = CommandType.StoredProcedure;

            // Pass some parameters to your database's Stored Procedure if you need to.
            // We're sending some quick dummy params here.
            command.Parameters.AddWithValue("active", "1");
            command.Parameters.AddWithValue("birthdate", "2018-05-29");

            // Open connection to database.
            connection.Open();
            // Execute the stored procedure and fill the dataset.
            da.Fill(result);
            // Close the connection.
            connection.Close();

            // Object disposal.
            da.Dispose();
            command.Dispose();
            connection.Dispose();

            // Return the query results.
            return result;
        }

        /// <summary>
        /// Construct the message body and send it by smpt mail.
        /// </summary>
        static void ProcessData()
        {
            // Store the query results.
            DataSet ds = new DataSet();
            // StringBuilder to construct your HTML table.
            StringBuilder table = new StringBuilder();

            // Get data from database;
            ds = QueryDatabase();

            // If records available:
            if( ds.Tables.Count > 0 )
            {
                // Start table's header construct.
                table.Append("<table><thead><tr>");

                // Iterate through each column to insert the column name in the custom table.
                foreach (DataColumn col in ds.Tables[0].Columns)
                {
                    table.Append("<td>" + col.ColumnName + "</td>");                    
                }

                // End header construct.
                table.Append("</tr></thead>");
            }

            // Now, iterate the database records.
            foreach (DataRow row in ds.Tables[0].Rows )
            {
                // Insert one TR per row.
                table.Append("<tr>");
                foreach(DataColumn dc in ds.Tables[0].Columns)
                {
                    // Insert each data column into a TD cell.
                    table.Append("<td>");
                    table.Append(row[dc.ColumnName]);
                    table.Append("</td>");
                }
                // Close the table row and goto next record if available or exit loop.
                table.Append("</tr>");
            }

            // All records inserted. Close the table.
            table.Append("</table>");

            // Dsiplay the table in console.
            Console.WriteLine(table.ToString());
            Console.ReadKey();

            /*
             * 
             * From here you could send "table.ToString()" as the "Body" parameter to your SMTP mail library.
             * 
             * */
        }
    }
}

最后,您将获得一个table.ToString(),其中存储您的自定义表,其中包含所有7个数据库查询joinen和HTML格式化。因此,您可以将此字符串作为参数发送到SMTP邮件库。

有些屏幕截图可以看到结果:

Console HTML code copied-pasted from Console to text editor, and manually formated to make it legible. HTML result viewed in browser

<强>更新

对于边框,您必须直接对表格元素应用一些样式,我还没有找到在构建电子邮件时包含CSS文件的方法:

<table style="border: 1px solid black">
  <thead>
    <tr style="background-color: lavender">
      <td style="border: 1px solid blue">Name<td>
    </tr>
  </thead>
  <tr>
    <td style="border: 1px solid blue">Name<td>
  </tr>
  ...
</table>

参考:https://www.w3schools.com/tags/att_style.asp

至于日期,您可以从SQL脚本中格式化它:

SELECT
    CAST(myDate as DATE)
FROM
  ...

或直接在C#代码中:

Date.Parse(yourDateField).ToString("yyyy-MM-dd");