public int DeleteAttribute(EntityAttribute entityAttribute)
        {
            int rowsAffected = 0;
            lock (_syncRoot)
            {
                _connection.Open();

                try
                {
                    using (SqlCommand command = new SqlCommand(DeleteStatement, _connection))
                    {
                        command.Parameters.Add(new SqlParameter("EntityType", SqlDbType.VarChar)).Value = entityAttribute.EntityType;
                        command.Parameters.Add(new SqlParameter("EntityName", SqlDbType.VarChar)).Value = entityAttribute.EntityName;
                        command.Parameters.Add(new SqlParameter("AttributeName", SqlDbType.VarChar)).Value = entityAttribute.AttributeName;
                        command.Parameters.Add(new SqlParameter("RefDate", SqlDbType.DateTime)).Value = entityAttribute.RefDate;

                        rowsAffected = command.ExecuteNonQuery();
                    }
                }
                finally
                {
                    _connection.Close();
                }
            }

            return rowsAffected;
        }
        public EntityAttribute WriteAttribute(EntityAttribute entityAttribute)
        {
            lock (_syncRoot)
            {
                _connection.Open();

                try
                {
                    using (SqlCommand command = new SqlCommand())
                    {
                        SqlTransaction txn = _connection.BeginTransaction();

                        command.Connection = _connection;
                        command.Transaction = txn;
                        command.CommandText = "declare xx clob; begin dbms_lob.createtemporary(xx, true, 0); :tempclob := xx; end;";
                        command.Parameters.Add(new SqlParameter("tempclob", SqlDbType.Text)).Direction = ParameterDirection.Output;

                        command.ExecuteNonQuery();
                        object tempLob = command.Parameters[0].Value;

                        //tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);  //TODO:  Fix (bg)
                        
                        byte[] value = System.Text.Encoding.Unicode.GetBytes(entityAttribute.ValueAsString);
                        //tempLob.Write(value, 0, value.Length);
                        //tempLob.EndBatch();
                    
                        command.Parameters.Clear();
                        command.CommandText = MergeStatement;
                    
                        command.Parameters.Add(new SqlParameter("EntityType", SqlDbType.VarChar)).Value = entityAttribute.EntityType;
                        command.Parameters.Add(new SqlParameter("EntityName", SqlDbType.VarChar)).Value = entityAttribute.EntityName;
                        command.Parameters.Add(new SqlParameter("AttributeName", SqlDbType.VarChar)).Value = entityAttribute.AttributeName;
                        command.Parameters.Add(new SqlParameter("RefDate", SqlDbType.DateTime)).Value = entityAttribute.RefDate;
                        command.Parameters.Add(new SqlParameter("Value", SqlDbType.Text)).Value = tempLob;
                        command.Parameters.Add(new SqlParameter("DataType", SqlDbType.VarChar)).Value = entityAttribute.DataType;
                        command.Parameters.Add(new SqlParameter("CreatedBy", SqlDbType.VarChar)).Value = entityAttribute.CreatedBy;
                        command.Parameters.Add(new SqlParameter("CreatedOn", SqlDbType.DateTime)).Value = entityAttribute.CreatedOn;                           

                        command.ExecuteNonQuery();
                        txn.Commit();
                    }

                }
                catch (Exception ex)
                { 
                    throw;
                }
                finally
                {                        
                    _connection.Close();
                }             
            }

            return entityAttribute;
        }
        /// <summary>
        /// Writes an attribute to the store
        /// </summary>
        /// <param name="entityType">The type of entity (e.g. Book)</param>
        /// <param name="entityName">The name of the entity (e.g. MyBook)</param>
        /// <param name="attributeName">The name of the attribute (e.g. BookAlias)</param>
        /// <param name="refDate">The reference date to get the attribute for</param>
        /// <param name="value">The value to store</param>
        /// <param name="createdBy">The name of the user creating the attribute</param>
        /// <returns>The EntityAttribute object representing the created entry</returns>
        public EntityAttribute Write(string entityType, string entityName, string attributeName, DateTime? refDate, object value, string createdBy)
        {
            if (createdBy == null)
            {
                createdBy = Environment.UserName;
            }

            EntityAttribute attribute = new EntityAttribute(entityType, entityName, attributeName, refDate.HasValue ? refDate.Value : DateTime.MinValue, value, createdBy, DateTime.UtcNow);
            return Write(attribute);
        }
 /// <summary>
 /// Deletes the passed entity attribute
 /// </summary>
 /// <param name="entityAttribute">The entity attribute to delete</param>
 /// <returns>the number of items deleted (note, this should really only ever return 1)</returns>
 public int Delete(EntityAttribute entityAttribute)
 {
     return _readerWriter.DeleteAttribute(entityAttribute);
 }
        /// <summary>
        /// Writes the passed entity attribute to the store
        /// </summary>
        /// <param name="entityAttribute">The entityAttribute to save</param>
        /// <returns>The updated attribute</returns>
        public EntityAttribute Write(EntityAttribute entityAttribute)
        {
            if (entityAttribute == null)
            {
                throw new ArgumentNullException("entityAttribute");
            }

            return _readerWriter.WriteAttribute(entityAttribute);
        }