using System.Collections; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Text; using Microsoft.SqlServer.Server; using Neo.Afx.ComponentModel; namespace Neo.Afx.Crm { /// /// Helper function to assist with sql dataset formatting based on a predefined message template /// public class MessageFormatter { #region MessageDetail Class private class MessageDetail { public SqlString Recipients; public SqlString Cc; public SqlString Bcc; public SqlString Subject; public SqlString Message; public MessageDetail(SqlString recipients, SqlString cc, SqlString bcc, SqlString subject, SqlString message) { Recipients = recipients; Cc = cc; Bcc = bcc; Subject = subject; Message = message; } } #endregion #region GetFormattedMessagesFillRow /// /// Method used by GetFormattedMessages to fill array /// /// /// /// /// /// /// public static void GetFormattedMessagesFillRow(object messageDetailObj, out SqlString recipients, out SqlString cc, out SqlString bcc, out SqlString subject, out SqlString message) { var obj = (MessageDetail)messageDetailObj; recipients = obj.Recipients; cc = obj.Cc; bcc = obj.Bcc; subject = obj.Subject; message = obj.Message; } #endregion /// /// Selects data from a provided SQL string and inserts it into the format string. /// recipientSql must contain the following fields: recipients, cc, bcc /// /// A table with popolated MessageDetail objects. [SqlFunction( IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read, FillRowMethodName = "GetFormattedMessagesFillRow", TableDefinition = "Recipients nvarchar(max), Cc nvarchar(max), Bcc nvarchar(max), Subject nvarchar(1000), Message nvarchar(max)")] public static IEnumerable GetFormattedMessages(SqlString recipientSql, SqlString dataSql, SqlString subject, SqlString messageTemplateStart, SqlString messageTemplateData, SqlString messageTemplateEnd) { return GetFormattedMessagesImpl(SqlUtilities.ClrConnectionString, recipientSql.Value, dataSql.Value, subject.Value, messageTemplateStart.Value, messageTemplateData.Value, messageTemplateEnd.Value); } /// /// Gets the formatted messages. /// /// The connection string. /// The recipient SQL. /// The data SQL. /// The subject. /// The message template start. /// The message template data. /// The message template end. /// public static IEnumerable GetFormattedMessagesImpl(string connectionString, string recipientSql, string dataSql, string subject, string messageTemplateStart, string messageTemplateData, string messageTemplateEnd) { var results = new ArrayList(); using(var connection = new SqlConnection(connectionString)) { connection.Open(); DataTable dt; using(var cmd = connection.CreateCommand()) { cmd.CommandType = CommandType.Text; cmd.CommandText = recipientSql; dt = cmd.FetchDataTable(); } using(var cmd = connection.CreateCommand()) { cmd.CommandType = CommandType.Text; foreach(DataRow row in dt.Rows) { var message = new StringBuilder(messageTemplateStart); cmd.CommandText = dataSql.Replace(EntityFormatType.Replacement, row); using(var reader = cmd.ExecuteReader(CommandBehavior.Default)) { while(reader.Read()) { var s = messageTemplateData.Replace(EntityFormatType.Replacement, reader); message.Append(s); } } message.Append(messageTemplateEnd); results.Add(new MessageDetail( row["recipients"].ToString(), row["cc"].ToString(), row["bcc"].ToString(), subject, message.ToString())); } } } return results; } } }