早上好Stack Overflow,我试图弄清楚如何将SQL查询结果格式化为电子邮件正文。但是有一些捕获 - 我正在使用App.config连接字符串,虽然我只引用一个服务器,但我需要引用7个不同的数据库。为了让事情更加混乱,我将在所有7个DB上运行相同的查询,并希望将结果组合到电子邮件正文中的一个漂亮的小表中。我正在使用类库来发送电子邮件,所以除了如何查询所有7个dbs并将数据组合到同一个表中之外,我几乎已经弄明白了。
我正在使用SMTP,这是一个控制台应用程序。
请注意,这是我在堆栈上发布的第一个问题,我已经对此进行了彻底的研究。我知道它说发布代码但我真的没有为它编写任何代码。我只是需要一个地方开始!我在SQL中比在C#中更有经验,所以如果这是一个基本问题,我道歉。如果您需要有关我的问题的更多信息,请告诉我们!
答案 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邮件库。
有些屏幕截图可以看到结果:
<强>更新强>
对于边框,您必须直接对表格元素应用一些样式,我还没有找到在构建电子邮件时包含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");