Click here to Skip to main content
15,884,298 members
Articles / Database Development / SQL Server

Ready-to-use Mass Emailing Functionality with C#, .NET 2.0, and Microsoft® SQL Server 2005 Service Broker

Rate me:
Please Sign up or sign in to vote.
4.84/5 (40 votes)
7 Sep 200613 min read 297.5K   4.6K   210  
This paper demonstrates an extensible mass emailing framework (Smart Mass Email SME). The demo implementation uses cutting edge .NET technologies available today such as C#, .NET 2.0, Microsoft® SQL Server 2005 Service Broker, MS Provider Pattern, Enterprise Library January 2006 etc.
/*
	File Generated by NetTiers templates [www.nettiers.com]
	Generated on : Friday, 1 September 2006
	Important: Do not modify this file. Edit the file SqlEmailMessageProvider.cs instead.
*/

#region using directives

using System;
using System.Data;
using System.Data.Common;

using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;

using System.Collections;
using System.Collections.Specialized;

using System.Diagnostics;
using SmartMassEmail.Entities;
using SmartMassEmail.Data;
using SmartMassEmail.Data.Bases;

#endregion

namespace SmartMassEmail.Data.SqlClient
{
	///<summary>
	/// This class is the SqlClient Data Access Logic Component implementation for the <see cref="EmailMessage"/> entity.
	///</summary>
	public partial class SqlEmailMessageProviderBase : EmailMessageProviderBase
	{
		#region Declarations
		
		string _connectionString;
	    bool _useStoredProcedure;
	    string _providerInvariantName;
			
		#endregion "Declarations"
			
		#region Constructors
		
		/// <summary>
		/// Creates a new <see cref="SqlEmailMessageProviderBase"/> instance.
		/// </summary>
		public SqlEmailMessageProviderBase()
		{
		}
	
	/// <summary>
	/// Creates a new <see cref="SqlEmailMessageProviderBase"/> instance.
	/// Uses connection string to connect to datasource.
	/// </summary>
	/// <param name="connectionString">The connection string to the database.</param>
	/// <param name="useStoredProcedure">A boolean value that indicates if we use the stored procedures or embedded queries.</param>
	/// <param name="providerInvariantName">Name of the invariant provider use by the DbProviderFactory.</param>
	public SqlEmailMessageProviderBase(string connectionString, bool useStoredProcedure, string providerInvariantName)
	{
		this._connectionString = connectionString;
		this._useStoredProcedure = useStoredProcedure;
		this._providerInvariantName = providerInvariantName;
	}
		
	#endregion "Constructors"
	
		#region Public properties
	/// <summary>
    /// Gets or sets the connection string.
    /// </summary>
    /// <value>The connection string.</value>
    public string ConnectionString
	{
		get {return this._connectionString;}
		set {this._connectionString = value;}
	}
	
	/// <summary>
    /// Gets or sets a value indicating whether to use stored procedures.
    /// </summary>
    /// <value><c>true</c> if we choose to use use stored procedures; otherwise, <c>false</c>.</value>
	public bool UseStoredProcedure
	{
		get {return this._useStoredProcedure;}
		set {this._useStoredProcedure = value;}
	}
	
	/// <summary>
    /// Gets or sets the invariant provider name listed in the DbProviderFactories machine.config section.
    /// </summary>
    /// <value>The name of the provider invariant.</value>
    public string ProviderInvariantName
    {
        get { return this._providerInvariantName; }
        set { this._providerInvariantName = value; }
    }
	#endregion
	
		#region Get Many To Many Relationship Functions
	#endregion
	
	
		#region Delete Functions
		/// <summary>
		/// 	Deletes a row from the DataSource.
		/// </summary>
		/// <param name="id">. Primary Key.</param>	
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <remarks>Deletes based on primary key(s).</remarks>
		/// <returns>Returns true if operation suceeded.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
		public override bool Delete(TransactionManager transactionManager, System.Guid id)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_Delete", _useStoredProcedure);
			database.AddInParameter(commandWrapper, "@ID", DbType.Guid, id);
			
			int results = 0;
			
			if (transactionManager != null)
			{	
				results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
			}
			else
			{
				results = Utility.ExecuteNonQuery(database,commandWrapper);
			}
			
			//Stop Tracking Now that it has been updated and persisted.
			if (DataRepository.Provider.EnableEntityTracking)
			{
				string entityKey = EntityLocator.ConstructKeyFromPkItems(typeof(EmailMessage)
					,id);
				EntityManager.StopTracking(entityKey);
			}
			
			if (results == 0)
			{
				//throw new DataException("The record has been already deleted.");
				return false;
			}
			
			return Convert.ToBoolean(results);
		}//end Delete
		#endregion

		#region Find Functions
		/// <summary>
		/// 	Returns rows meeting the whereclause condition from the DataSource.
		/// </summary>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <param name="whereClause">Specifies the condition for the rows returned by a query (Name='John Doe', Name='John Doe' AND Id='1', Name='John Doe' OR Id='1').</param>
		/// <param name="start">Row number at which to start reading.</param>
		/// <param name="pageLength">Number of rows to return.</param>
		/// <param name="count">out. The number of rows that match this query.</param>
		/// <remarks>Operators must be capitalized (OR, AND)</remarks>
		/// <returns>Returns a typed collection of SmartMassEmail.Entities.EmailMessage objects.</returns>
		public override SmartMassEmail.Entities.TList<EmailMessage> Find(TransactionManager transactionManager, string whereClause, int start, int pageLength, out int count)
		{
			count = -1;
			if (whereClause.IndexOf(";") > -1)
				return new SmartMassEmail.Entities.TList<EmailMessage>();
	
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_Find", _useStoredProcedure);

		bool searchUsingOR = false;
		if (whereClause.IndexOf("OR") > 0) // did they want to do "a=b OR c=d OR..."?
			searchUsingOR = true;
		
		database.AddInParameter(commandWrapper, "@SearchUsingOR", DbType.Boolean, searchUsingOR);
		
		database.AddInParameter(commandWrapper, "@ID", DbType.Guid, DBNull.Value);
		database.AddInParameter(commandWrapper, "@ChangeStamp", DbType.DateTime, DBNull.Value);
		database.AddInParameter(commandWrapper, "@Priority", DbType.Int32, DBNull.Value);
		database.AddInParameter(commandWrapper, "@Status", DbType.Int32, DBNull.Value);
		database.AddInParameter(commandWrapper, "@NumberOfRetry", DbType.Int32, DBNull.Value);
		database.AddInParameter(commandWrapper, "@RetryTime", DbType.DateTime, DBNull.Value);
		database.AddInParameter(commandWrapper, "@MaximumRetry", DbType.Int32, DBNull.Value);
		database.AddInParameter(commandWrapper, "@ExpiryDatetime", DbType.DateTime, DBNull.Value);
		database.AddInParameter(commandWrapper, "@ArrivedDateTime", DbType.DateTime, DBNull.Value);
		database.AddInParameter(commandWrapper, "@SenderInfo", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailTo", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailFrom", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailSubject", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailBody", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailCC", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@EmailBCC", DbType.AnsiString, DBNull.Value);
		database.AddInParameter(commandWrapper, "@IsHtml", DbType.Boolean, DBNull.Value);
	
			// replace all instances of 'AND' and 'OR' because we already set searchUsingOR
			whereClause = whereClause.Replace("AND", "|").Replace("OR", "|") ; 
			string[] clauses = whereClause.ToLower().Split('|');
		
			// Here's what's going on below: Find a field, then to get the value we
			// drop the field name from the front, trim spaces, drop the '=' sign,
			// trim more spaces, and drop any outer single quotes.
			// Now handles the case when two fields start off the same way - like "Friendly='Yes' AND Friend='john'"
				
			char[] equalSign = {'='};
			char[] singleQuote = {'\''};
	   		foreach (string clause in clauses)
			{
				if (clause.Trim().StartsWith("id ") || clause.Trim().StartsWith("id="))
				{
					database.SetParameterValue(commandWrapper, "@ID", new Guid(
						clause.Replace("id","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote)));
					continue;
				}
				if (clause.Trim().StartsWith("changestamp ") || clause.Trim().StartsWith("changestamp="))
				{
					database.SetParameterValue(commandWrapper, "@ChangeStamp", 
						clause.Replace("changestamp","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("priority ") || clause.Trim().StartsWith("priority="))
				{
					database.SetParameterValue(commandWrapper, "@Priority", 
						clause.Replace("priority","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("status ") || clause.Trim().StartsWith("status="))
				{
					database.SetParameterValue(commandWrapper, "@Status", 
						clause.Replace("status","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("numberofretry ") || clause.Trim().StartsWith("numberofretry="))
				{
					database.SetParameterValue(commandWrapper, "@NumberOfRetry", 
						clause.Replace("numberofretry","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("retrytime ") || clause.Trim().StartsWith("retrytime="))
				{
					database.SetParameterValue(commandWrapper, "@RetryTime", 
						clause.Replace("retrytime","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("maximumretry ") || clause.Trim().StartsWith("maximumretry="))
				{
					database.SetParameterValue(commandWrapper, "@MaximumRetry", 
						clause.Replace("maximumretry","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("expirydatetime ") || clause.Trim().StartsWith("expirydatetime="))
				{
					database.SetParameterValue(commandWrapper, "@ExpiryDatetime", 
						clause.Replace("expirydatetime","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("arriveddatetime ") || clause.Trim().StartsWith("arriveddatetime="))
				{
					database.SetParameterValue(commandWrapper, "@ArrivedDateTime", 
						clause.Replace("arriveddatetime","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("senderinfo ") || clause.Trim().StartsWith("senderinfo="))
				{
					database.SetParameterValue(commandWrapper, "@SenderInfo", 
						clause.Replace("senderinfo","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailto ") || clause.Trim().StartsWith("emailto="))
				{
					database.SetParameterValue(commandWrapper, "@EmailTo", 
						clause.Replace("emailto","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailfrom ") || clause.Trim().StartsWith("emailfrom="))
				{
					database.SetParameterValue(commandWrapper, "@EmailFrom", 
						clause.Replace("emailfrom","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailsubject ") || clause.Trim().StartsWith("emailsubject="))
				{
					database.SetParameterValue(commandWrapper, "@EmailSubject", 
						clause.Replace("emailsubject","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailbody ") || clause.Trim().StartsWith("emailbody="))
				{
					database.SetParameterValue(commandWrapper, "@EmailBody", 
						clause.Replace("emailbody","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailcc ") || clause.Trim().StartsWith("emailcc="))
				{
					database.SetParameterValue(commandWrapper, "@EmailCC", 
						clause.Replace("emailcc","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("emailbcc ") || clause.Trim().StartsWith("emailbcc="))
				{
					database.SetParameterValue(commandWrapper, "@EmailBCC", 
						clause.Replace("emailbcc","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
				if (clause.Trim().StartsWith("ishtml ") || clause.Trim().StartsWith("ishtml="))
				{
					database.SetParameterValue(commandWrapper, "@IsHtml", 
						clause.Replace("ishtml","").Trim().TrimStart(equalSign).Trim().Trim(singleQuote));
					continue;
				}
	
				throw new ArgumentException("Unable to use this part of the where clause in this version of Find: " + clause);
			}
					
			IDataReader reader = null;
			//Create Collection
			SmartMassEmail.Entities.TList<EmailMessage> rows = new SmartMassEmail.Entities.TList<EmailMessage>();
	
				
			try
			{
				if (transactionManager != null)
				{
					reader = Utility.ExecuteReader(transactionManager, commandWrapper);
				}
				else
				{
					reader = Utility.ExecuteReader(database, commandWrapper);
				}		
				
				Fill(reader, rows, start, pageLength);
				
				if(reader.NextResult())
				{
					if(reader.Read())
					{
						count = reader.GetInt32(0);
					}
				}
			}
			finally
			{
				if (reader != null) 
					reader.Close();				
			}
			return rows;
		}
		
		#endregion "Find Functions"
	
		#region GetList Functions
				
		/// <summary>
		/// 	Gets All rows from the DataSource.
		/// </summary>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <param name="start">Row number at which to start reading.</param>
		/// <param name="pageLength">Number of rows to return.</param>
		/// <param name="count">out. The number of rows that match this query.</param>
		/// <remarks></remarks>
		/// <returns>Returns a typed collection of SmartMassEmail.Entities.EmailMessage objects.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
		public override SmartMassEmail.Entities.TList<EmailMessage> GetAll(TransactionManager transactionManager, int start, int pageLength, out int count)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_Get_List", _useStoredProcedure);
			
			IDataReader reader = null;
		
			//Create Collection
			SmartMassEmail.Entities.TList<EmailMessage> rows = new SmartMassEmail.Entities.TList<EmailMessage>();
			
			try
			{
				if (transactionManager != null)
				{
					reader = Utility.ExecuteReader(transactionManager, commandWrapper);
				}
				else
				{
					reader = Utility.ExecuteReader(database, commandWrapper);
				}		
		
				Fill(reader, rows, start, pageLength);
				count = -1;
				if(reader.NextResult())
				{
					if(reader.Read())
					{
						count = reader.GetInt32(0);
					}
				}
			}
			finally 
			{
				if (reader != null) 
					reader.Close();
			}
			return rows;
		}//end getall
		
		#endregion
				
		#region Paged Recordset
				
		/// <summary>
		/// Gets a page of rows from the DataSource.
		/// </summary>
		/// <param name="start">Row number at which to start reading.</param>
		/// <param name="pageLength">Number of rows to return.</param>
		/// <param name="count">Number of rows in the DataSource.</param>
		/// <param name="whereClause">Specifies the condition for the rows returned by a query (Name='John Doe', Name='John Doe' AND Id='1', Name='John Doe' OR Id='1').</param>
		/// <param name="orderBy">Specifies the sort criteria for the rows in the DataSource (Name ASC; BirthDay DESC, Name ASC);</param>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <remarks></remarks>
		/// <returns>Returns a typed collection of SmartMassEmail.Entities.EmailMessage objects.</returns>
		public override SmartMassEmail.Entities.TList<EmailMessage> GetPaged(TransactionManager transactionManager, string whereClause, string orderBy, int start, int pageLength, out int count)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_GetPaged", _useStoredProcedure);
			
			database.AddInParameter(commandWrapper, "@WhereClause", DbType.String, whereClause);
			database.AddInParameter(commandWrapper, "@OrderBy", DbType.String, orderBy);
			database.AddInParameter(commandWrapper, "@PageIndex", DbType.Int32, start);
			database.AddInParameter(commandWrapper, "@PageSize", DbType.Int32, pageLength);
		
			IDataReader reader = null;
			//Create Collection
			SmartMassEmail.Entities.TList<EmailMessage> rows = new SmartMassEmail.Entities.TList<EmailMessage>();
			
			try
			{
				if (transactionManager != null)
				{
					reader = Utility.ExecuteReader(transactionManager, commandWrapper);
				}
				else
				{
					reader = Utility.ExecuteReader(database, commandWrapper);
				}
				
				Fill(reader, rows, 0, int.MaxValue);
				count = rows.Count;

				if(reader.NextResult())
				{
					if(reader.Read())
					{
						count = reader.GetInt32(0);
					}
				}
			}
			catch(Exception)
			{			
				throw;
			}
			finally
			{
				if (reader != null) 
					reader.Close();
			}
			
			return rows;
		}
		
		#endregion	
		
		#region Get By Foreign Key Functions
	#endregion
	
		#region Get By Index Functions

		#region GetByID
					
		/// <summary>
		/// 	Gets rows from the datasource based on the PK_EmailMessage index.
		/// </summary>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <param name="id"></param>
		/// <param name="start">Row number at which to start reading.</param>
		/// <param name="pageLength">Number of rows to return.</param>
		/// <param name="count">out parameter to get total records for query</param>
		/// <returns>Returns an instance of the <see cref="SmartMassEmail.Entities.EmailMessage"/> class.</returns>
		/// <remarks></remarks>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
		public override SmartMassEmail.Entities.EmailMessage GetByID(TransactionManager transactionManager, System.Guid id, int start, int pageLength, out int count)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_GetByID", _useStoredProcedure);
			
				database.AddInParameter(commandWrapper, "@ID", DbType.Guid, id);
			
			IDataReader reader = null;
			SmartMassEmail.Entities.TList<EmailMessage> tmp = new SmartMassEmail.Entities.TList<EmailMessage>();
			try
			{
				if (transactionManager != null)
				{
					reader = Utility.ExecuteReader(transactionManager, commandWrapper);
				}
				else
				{
					reader = Utility.ExecuteReader(database, commandWrapper);
				}		
		
				//Create collection and fill
				Fill(reader, tmp, start, pageLength);
				count = -1;
				if(reader.NextResult())
				{
					if(reader.Read())
					{
						count = reader.GetInt32(0);
					}
				}
			}
			finally 
			{
				if (reader != null) 
					reader.Close();
			}
			
			if (tmp.Count == 1)
			{
				return tmp[0];
			}
			else if (tmp.Count == 0)
			{
				return null;
			}
			else
			{
				throw new DataException("Cannot find the unique instance of the class.");
			}
			
			//return rows;
		}
		
		#endregion

	#endregion Get By Index Functions

		#region Insert Functions
		/// <summary>
		/// Lets you efficiently bulk many entity to the database.
		/// </summary>
		/// <param name="transactionManager">The transaction manager.</param>
		/// <param name="entities">The entities.</param>
		/// <remarks>
		///		After inserting into the datasource, the SmartMassEmail.Entities.EmailMessage object will be updated
		/// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
		/// </remarks>	
		public override void BulkInsert(TransactionManager transactionManager, TList<SmartMassEmail.Entities.EmailMessage> entities)
		{
			//System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
			
			System.Data.SqlClient.SqlBulkCopy bulkCopy = null;
	
			if (transactionManager != null && transactionManager.IsOpen)
			{			
				System.Data.SqlClient.SqlConnection cnx = transactionManager.TransactionObject.Connection as System.Data.SqlClient.SqlConnection;
				System.Data.SqlClient.SqlTransaction transaction = transactionManager.TransactionObject as System.Data.SqlClient.SqlTransaction;
				bulkCopy = new System.Data.SqlClient.SqlBulkCopy(cnx, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints, transaction); //, null);
			}
			else
			{
				bulkCopy = new System.Data.SqlClient.SqlBulkCopy(this._connectionString, System.Data.SqlClient.SqlBulkCopyOptions.CheckConstraints); //, null);
			}
			
			bulkCopy.BulkCopyTimeout = 360;
			bulkCopy.DestinationTableName = "EmailMessage";
			
			DataTable dataTable = new DataTable();
			DataColumn col0 = dataTable.Columns.Add("ID", typeof(System.Guid));
			col0.AllowDBNull = false;		
			DataColumn col1 = dataTable.Columns.Add("ChangeStamp", typeof(System.DateTime));
			col1.AllowDBNull = false;		
			DataColumn col2 = dataTable.Columns.Add("Priority", typeof(System.Int32));
			col2.AllowDBNull = false;		
			DataColumn col3 = dataTable.Columns.Add("Status", typeof(System.Int32));
			col3.AllowDBNull = false;		
			DataColumn col4 = dataTable.Columns.Add("NumberOfRetry", typeof(System.Int32));
			col4.AllowDBNull = false;		
			DataColumn col5 = dataTable.Columns.Add("RetryTime", typeof(System.DateTime));
			col5.AllowDBNull = false;		
			DataColumn col6 = dataTable.Columns.Add("MaximumRetry", typeof(System.Int32));
			col6.AllowDBNull = false;		
			DataColumn col7 = dataTable.Columns.Add("ExpiryDatetime", typeof(System.DateTime));
			col7.AllowDBNull = false;		
			DataColumn col8 = dataTable.Columns.Add("ArrivedDateTime", typeof(System.DateTime));
			col8.AllowDBNull = false;		
			DataColumn col9 = dataTable.Columns.Add("SenderInfo", typeof(System.String));
			col9.AllowDBNull = false;		
			DataColumn col10 = dataTable.Columns.Add("EmailTo", typeof(System.String));
			col10.AllowDBNull = false;		
			DataColumn col11 = dataTable.Columns.Add("EmailFrom", typeof(System.String));
			col11.AllowDBNull = false;		
			DataColumn col12 = dataTable.Columns.Add("EmailSubject", typeof(System.String));
			col12.AllowDBNull = false;		
			DataColumn col13 = dataTable.Columns.Add("EmailBody", typeof(System.String));
			col13.AllowDBNull = false;		
			DataColumn col14 = dataTable.Columns.Add("EmailCC", typeof(System.String));
			col14.AllowDBNull = false;		
			DataColumn col15 = dataTable.Columns.Add("EmailBCC", typeof(System.String));
			col15.AllowDBNull = false;		
			DataColumn col16 = dataTable.Columns.Add("IsHtml", typeof(System.Boolean));
			col16.AllowDBNull = false;		
			
			bulkCopy.ColumnMappings.Add("ID", "ID");
			bulkCopy.ColumnMappings.Add("ChangeStamp", "ChangeStamp");
			bulkCopy.ColumnMappings.Add("Priority", "Priority");
			bulkCopy.ColumnMappings.Add("Status", "Status");
			bulkCopy.ColumnMappings.Add("NumberOfRetry", "NumberOfRetry");
			bulkCopy.ColumnMappings.Add("RetryTime", "RetryTime");
			bulkCopy.ColumnMappings.Add("MaximumRetry", "MaximumRetry");
			bulkCopy.ColumnMappings.Add("ExpiryDatetime", "ExpiryDatetime");
			bulkCopy.ColumnMappings.Add("ArrivedDateTime", "ArrivedDateTime");
			bulkCopy.ColumnMappings.Add("SenderInfo", "SenderInfo");
			bulkCopy.ColumnMappings.Add("EmailTo", "EmailTo");
			bulkCopy.ColumnMappings.Add("EmailFrom", "EmailFrom");
			bulkCopy.ColumnMappings.Add("EmailSubject", "EmailSubject");
			bulkCopy.ColumnMappings.Add("EmailBody", "EmailBody");
			bulkCopy.ColumnMappings.Add("EmailCC", "EmailCC");
			bulkCopy.ColumnMappings.Add("EmailBCC", "EmailBCC");
			bulkCopy.ColumnMappings.Add("IsHtml", "IsHtml");
			
			foreach(SmartMassEmail.Entities.EmailMessage entity in entities)
			{
				if (entity.EntityState != EntityState.Added)
					continue;
					
				DataRow row = dataTable.NewRow();
				
					row["ID"] = entity.ID;
							
				
					row["ChangeStamp"] = entity.ChangeStamp;
							
				
					row["Priority"] = entity.Priority;
							
				
					row["Status"] = entity.Status;
							
				
					row["NumberOfRetry"] = entity.NumberOfRetry;
							
				
					row["RetryTime"] = entity.RetryTime;
							
				
					row["MaximumRetry"] = entity.MaximumRetry;
							
				
					row["ExpiryDatetime"] = entity.ExpiryDatetime;
							
				
					row["ArrivedDateTime"] = entity.ArrivedDateTime;
							
				
					row["SenderInfo"] = entity.SenderInfo;
							
				
					row["EmailTo"] = entity.EmailTo;
							
				
					row["EmailFrom"] = entity.EmailFrom;
							
				
					row["EmailSubject"] = entity.EmailSubject;
							
				
					row["EmailBody"] = entity.EmailBody;
							
				
					row["EmailCC"] = entity.EmailCC;
							
				
					row["EmailBCC"] = entity.EmailBCC;
							
				
					row["IsHtml"] = entity.IsHtml;
							
				
				dataTable.Rows.Add(row);
			}		
			
			// send the data to the server		
			bulkCopy.WriteToServer(dataTable);		
			
			// update back the state
			foreach(SmartMassEmail.Entities.EmailMessage entity in entities)
			{
				if (entity.EntityState != EntityState.Added)
					continue;
			
				entity.AcceptChanges();
			}
		}
				
		/// <summary>
		/// 	Inserts a SmartMassEmail.Entities.EmailMessage object into the datasource using a transaction.
		/// </summary>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <param name="entity">SmartMassEmail.Entities.EmailMessage object to insert.</param>
		/// <remarks>
		///		After inserting into the datasource, the SmartMassEmail.Entities.EmailMessage object will be updated
		/// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
		/// </remarks>	
		/// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
		public override bool Insert(TransactionManager transactionManager, SmartMassEmail.Entities.EmailMessage entity)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_Insert", _useStoredProcedure);
			
			database.AddInParameter(commandWrapper, "@ID", DbType.Guid, entity.ID );
			database.AddInParameter(commandWrapper, "@ChangeStamp", DbType.DateTime, entity.ChangeStamp );
			database.AddInParameter(commandWrapper, "@Priority", DbType.Int32, entity.Priority );
			database.AddInParameter(commandWrapper, "@Status", DbType.Int32, entity.Status );
			database.AddInParameter(commandWrapper, "@NumberOfRetry", DbType.Int32, entity.NumberOfRetry );
			database.AddInParameter(commandWrapper, "@RetryTime", DbType.DateTime, entity.RetryTime );
			database.AddInParameter(commandWrapper, "@MaximumRetry", DbType.Int32, entity.MaximumRetry );
			database.AddInParameter(commandWrapper, "@ExpiryDatetime", DbType.DateTime, entity.ExpiryDatetime );
			database.AddInParameter(commandWrapper, "@ArrivedDateTime", DbType.DateTime, entity.ArrivedDateTime );
			database.AddInParameter(commandWrapper, "@SenderInfo", DbType.AnsiString, entity.SenderInfo );
			database.AddInParameter(commandWrapper, "@EmailTo", DbType.AnsiString, entity.EmailTo );
			database.AddInParameter(commandWrapper, "@EmailFrom", DbType.AnsiString, entity.EmailFrom );
			database.AddInParameter(commandWrapper, "@EmailSubject", DbType.AnsiString, entity.EmailSubject );
			database.AddInParameter(commandWrapper, "@EmailBody", DbType.AnsiString, entity.EmailBody );
			database.AddInParameter(commandWrapper, "@EmailCC", DbType.AnsiString, entity.EmailCC );
			database.AddInParameter(commandWrapper, "@EmailBCC", DbType.AnsiString, entity.EmailBCC );
			database.AddInParameter(commandWrapper, "@IsHtml", DbType.Boolean, entity.IsHtml );
			
			int results = 0;
			
				
			if (transactionManager != null)
			{
				results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
			}
			else
			{
				results = Utility.ExecuteNonQuery(database,commandWrapper);
			}
					
			
			entity.OriginalID = entity.ID;
			
			entity.AcceptChanges();
	
			return Convert.ToBoolean(results);
		}	
		#endregion

		#region Update Functions
				
		/// <summary>
		/// 	Update an existing row in the datasource.
		/// </summary>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <param name="entity">SmartMassEmail.Entities.EmailMessage object to update.</param>
		/// <remarks>
		///		After updating the datasource, the SmartMassEmail.Entities.EmailMessage object will be updated
		/// 	to refelect any changes made by the datasource. (ie: identity or computed columns)
		/// </remarks>
		/// <returns>Returns true if operation is successful.</returns>
        /// <exception cref="System.Exception">The command could not be executed.</exception>
        /// <exception cref="System.Data.DataException">The <paramref name="transactionManager"/> is not open.</exception>
        /// <exception cref="System.Data.Common.DbException">The command could not be executed.</exception>
		public override bool Update(TransactionManager transactionManager, SmartMassEmail.Entities.EmailMessage entity)
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = StoredProcedureProvider.GetCommandWrapper(database, "dbo.EmailMessage_Update", _useStoredProcedure);
			
			database.AddInParameter(commandWrapper, "@ID", DbType.Guid, entity.ID );
			database.AddInParameter(commandWrapper, "@OriginalID", DbType.Guid, entity.OriginalID);
			database.AddInParameter(commandWrapper, "@ChangeStamp", DbType.DateTime, entity.ChangeStamp );
			database.AddInParameter(commandWrapper, "@Priority", DbType.Int32, entity.Priority );
			database.AddInParameter(commandWrapper, "@Status", DbType.Int32, entity.Status );
			database.AddInParameter(commandWrapper, "@NumberOfRetry", DbType.Int32, entity.NumberOfRetry );
			database.AddInParameter(commandWrapper, "@RetryTime", DbType.DateTime, entity.RetryTime );
			database.AddInParameter(commandWrapper, "@MaximumRetry", DbType.Int32, entity.MaximumRetry );
			database.AddInParameter(commandWrapper, "@ExpiryDatetime", DbType.DateTime, entity.ExpiryDatetime );
			database.AddInParameter(commandWrapper, "@ArrivedDateTime", DbType.DateTime, entity.ArrivedDateTime );
			database.AddInParameter(commandWrapper, "@SenderInfo", DbType.AnsiString, entity.SenderInfo );
			database.AddInParameter(commandWrapper, "@EmailTo", DbType.AnsiString, entity.EmailTo );
			database.AddInParameter(commandWrapper, "@EmailFrom", DbType.AnsiString, entity.EmailFrom );
			database.AddInParameter(commandWrapper, "@EmailSubject", DbType.AnsiString, entity.EmailSubject );
			database.AddInParameter(commandWrapper, "@EmailBody", DbType.AnsiString, entity.EmailBody );
			database.AddInParameter(commandWrapper, "@EmailCC", DbType.AnsiString, entity.EmailCC );
			database.AddInParameter(commandWrapper, "@EmailBCC", DbType.AnsiString, entity.EmailBCC );
			database.AddInParameter(commandWrapper, "@IsHtml", DbType.Boolean, entity.IsHtml );
			
			int results = 0;
			
			
			if (transactionManager != null)
			{
				results = Utility.ExecuteNonQuery(transactionManager, commandWrapper);
			}
			else
			{
				results = Utility.ExecuteNonQuery(database,commandWrapper);
			}
			
			//Stop Tracking Now that it has been updated and persisted.
			if (DataRepository.Provider.EnableEntityTracking)
				EntityManager.StopTracking(entity.EntityTrackingKey);
			
			entity.OriginalID = entity.ID;
			
			entity.AcceptChanges();
	
			return Convert.ToBoolean(results);
		}
			
		#endregion
		
		#region Custom Methods
	
		#region _EmailMessage_GetPendingEmailMessage
					
		/// <summary>
		///	This method wrap the '_EmailMessage_GetPendingEmailMessage' stored procedure. 
		/// </summary>	
		/// <param name="start">Row number at which to start reading.</param>
		/// <param name="pageLength">Number of rows to return.</param>
		/// <param name="transactionManager"><see cref="TransactionManager"/> object</param>
		/// <remark>This method is generate from a stored procedure.</remark>
		/// <returns>A <see cref="SmartMassEmail.Entities.TList&lt;EmailMessage&gt;"/> instance.</returns>
		public override SmartMassEmail.Entities.TList<EmailMessage> GetPendingEmailMessage(TransactionManager transactionManager, int start, int pageLength )
		{
			SqlDatabase database = new SqlDatabase(this._connectionString);
			DbCommand commandWrapper = database.GetStoredProcCommand("_EmailMessage_GetPendingEmailMessage");
			
	
			
			IDataReader reader = null;

			if (transactionManager != null)
			{	
				reader = Utility.ExecuteReader(transactionManager, commandWrapper);
			}
			else
			{
				reader = Utility.ExecuteReader(database, commandWrapper);
			}			
			
			//Create Collection
				SmartMassEmail.Entities.TList<EmailMessage> rows = new SmartMassEmail.Entities.TList<EmailMessage>();
				try
				{    
					Fill(reader, rows, start, pageLength);
				}
				finally
				{
					if (reader != null) 
						reader.Close();
				}

				return rows;
		}
		#endregion
		#endregion
	}//end class
} // end namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Australia Australia
I have been awarded MVP (Visual C#) for year 2007, 2008, 2009. I am a Microsoft Certified Application Developer (C# .Net). I currently live in Melbourne, Australia. I am a co-founder and core developer of Pageflakes www.pageflakes.com and Founder of Simplexhub, a highly experienced software development company based in Melbourne Australia and Dhaka, Bangladesh. Simplexhub.
My BLOG http://www.geekswithblogs.net/shahed
http://msmvps.com/blogs/shahed/Default.aspx.

Comments and Discussions