Cambiar la edición y el tamaño de nuestras bases de datos en SQL Azure

Cuando decidimos contratar SQL Azure como servidor de nuestras bases de datos relacionales lo primero que debemos estimar es el tamaño de nuestra base de datos. En la actualidad existen diferentes tamaños disponibles, agrupadas en dos ediciones:

  • Web edition
    • 1 GB
    • 5 GB
  • Business edition
    • 10 GB
    • 20 GB
    • 30 GB
    • 40 GB
    • 50 GB

Cuando queremos dar de alta una base de datos de cualquiera de estos tamaños podemos hacerlo bien a través del portal de Windows Azure:

a través de SQL Server 2008 R2 Management Studio:

 o bien utilizando directamente la siguiente sentencia SQL:

Create DATABASE mybbdd (EDITION='web',MAXSIZE=1GB)

Lo más lógico,  cuando utilizamos un modelo Pay as you go, es que vayamos adaptando el tamaño de nuestras base de datos cuando nuestro negocio lo requiera. A día de hoy el portal no nos ofrece una forma visual para modificar las características de las bases de datos existentes, por lo que es necesario modificar las mismas utilizando sentencias SQL. Cuando realizamos una modificación esta puede ser a nivel de edición y/o de tamaño:

ALTER DATABASE mybbdd MODIFY (EDITION='business', MAXSIZE=50GB)

 

ALTER DATABASE mybbdd MODIFY (EDITION='web', MAXSIZE=5GB)

Nota: En realidad, indicando sólo el tamaño es suficiente, ya que la edición será modificada automáticamente de web a business o viceversa si la situación lo requiere.

ALTER DATABASE mybbdd MODIFY (MAXSIZE=20GB)

Más información

Espero que sea de utilidad :D

¡Saludos!

Instalar Windows Azure Service Management CmdLets en Windows 7 SP 1 con Windows Azure SDK 1.4

Después de la nueva versión del SDK de Windows Azure y el Service Pack 1 de Windows 7, podemos encontrarnos ciertas trabas si intentamos instalar Windows Azure Service Management CmdLets:

Esto puede ocurrir principalmente por varios motivos:

  • Tenemos instalado el service pack 1 para Windows 7.
  • Hemos actualizado a Windows Azure SDK 1.4
  • Ambos :D

 Al no tener las nuevas versiones contempladas tanto en uno de los archivos de configuración como en uno de los script de powershell no puede reconocer las nuevas versiones tanto de compilación del sistema operativo como la del SDK. Para solucionarlo, podemos realizar los siguientes pasos:

Añadir el builder number de Windows 7 con sp 1

Dentro del directorio de WASM nos ubicamos en WASMCmdletssetup. Dentro de la misma tenemos un archivo llamado Dependencies.dep el cual lo abrimos con el Notepad para añadir el nuevo build number.

En este archivo podemos ver y modificar todas las dependencias necesarias para la instalación e incluso modificar la descripción y la url donde de donde podemos descargar la dependencia requerida. Centrándonos en el sistema operativo, como vemos en la imagen anterior, vemos que aparece un atributo llamado buildNumber el cual contiene todas las numeraciones de las compilaciones válidas. 7600 se corresponde con Windows 7 sin service pack. ¿Cómo sabemos cuál es la versión de compilación del sistema operativo? La forma más sencilla de llegar a este valor es abriendo una aplicación propietaria de Microsoft integrada en el sistema operativo que tenemos instalado. Por ejemplo, abrimos la aplicación Paint y pulsamos sobre About Paint/Sobre Paint.

Voilà! En este caso podemos confirmar que 7601 se corresponde con Windows 7 SP 1:D

El siguiente paso se trata de modificar uno de los powershell donde se verifica la versión del SDK de Windows Azure dentro del registro. En la versión anterior, el número anterior se correspondía con la 1.3.11122.0038.

Para que la comprobación se realice con éxito, necesitamos cambiar el valor de SearchVersion a 1.4.20227.1419 como se muestra en la imagen.

¡Listo! ya tenemos adaptadas todas las comprobaciones para lanzar de nuevo la instalación.

Espero que sea de utilidad :D

¡Saludos!

Refrescar un WebGrid cada X tiempo de forma asíncrona

Con la nueva versión ASP.NET MVC 3, disponemos de una nueva extensión para la creación de grids. Para conocer más detalles sobre este nuevo helper podéis consultar el artículo de Jose M. Aguilar :)

En este post me gustaría mostraros cómo es posible actualizar de forma asíncrona un grid cada un número determinado de segundos.

Del lado del servidor he adjuntado una base de datos con una única tabla para el ejemplo que os quiero mostrar:

Un repositorio para recuperar los valores:


using System.Linq;

namespace WebGridAsync.Models
{
    public class StuffRepository
    {
        private readonly StuffEntities _model;
        public StuffRepository()
        {
            _model = new StuffEntities();
        }

        public FileViewModel GetFiles(int page = 1)
        {
            var fileViewModel = new FileViewModel();
            var files = _model.Files.ToList();
            fileViewModel.FilesPerPages = 5;
            fileViewModel.NumberOfFiles = _model.Files.Count();
            fileViewModel.Files = files.Skip((page - 1) * fileViewModel.FilesPerPages)
                                       .Take(fileViewModel.FilesPerPages);
            return fileViewModel;
        }

        public void SaveChanges()
        {
            _model.SaveChanges();
        }
    }
}

Y por último un controlador donde lo que vamos a actualizar es el estado de los archivos en cada llamada:

using System.Web.Mvc;
using WebGridAsync.Models;

namespace WebGridAsync.Controllers
{
    public class HomeController : Controller
    {
        private readonly StuffRepository _stuffRepository;
        public HomeController()
        {
            _stuffRepository = new StuffRepository();
        }

        public ActionResult Index(int page = 1)
        {
            return View(GetFilesWithUpdatedStatus());
        }

        public FileViewModel GetFilesWithUpdatedStatus()
        {
            var fileViewModel = _stuffRepository.GetFiles();

            foreach (var myFile in fileViewModel.Files)
            {
                switch (myFile.Status)
                {
                    case "Pending":
                        myFile.Status = "Processing";
                        break;
                    case "Processing":
                        myFile.Status = "Waiting";
                        break;
                    case "Waiting":
                        myFile.Status = "More waiting...";
                        break;
                    case "More waiting...":
                        myFile.Status = "Completed";
                        break;
                    default:
                        myFile.Status = "Pending";
                        break;
                }
            }

            _stuffRepository.SaveChanges();
            return fileViewModel;
        }
    }
}

Por último, necesitamos crear una vista donde hagamos uso del helper WebGrid. Es importante que el mismo esté incluido en un div con un id asociado.

@model WebGridAsync.Models.FileViewModel
@{
    ViewBag.Title = "Async WebGrid";

    WebGrid grid = new WebGrid(rowsPerPage: Model.FilesPerPages, canSort: false);
    grid.Bind(Model.Files, rowCount: Model.NumberOfFiles);
}
<h2>@ViewBag.Message</h2>
<div id="myWebGrid">
    @grid.GetHtml(columns: new[]{
    grid.Column("Name"),
    grid.Column("Date"),
    grid.Column("Status")
})
</div>

Para hacer la llamada asíncrona, necesitamos utilizar algo de código javascript, con la ayuda de JQuery. En la misma página que el grid anterior incluimos lo siguiente:

<script language="javascript" type="text/javascript">

    $(document).ready(function () {
        $.ajaxSetup({
            cache: false
        });

        setTimeout(reloadAsync, 5000);
    });

    function reloadAsync() {
        $("#myWebGrid").load("/Home/Index #myWebGrid", function (response, status, xhr) {
            if (status == "error") {
                var msg = "Sorry but there was an error: ";
                $("#error").html(msg + xhr.status + " " + xhr.statusText);
            }
            else {
                setTimeout(reloadAsync, 5000);
            }

        });

    }
</script>

Lo que estamos haciendo en realidad es inicializar un timer para que cada 5 segundos solicite los datos al servidor. El método load de JQuery va a realizar una llamada a la acción Index del controlador Home para que este le devuelva la página renderizada. Una vez obtiene el resultado va a localizar el elemento div myWebGrid para reemplazar el que se está visualizando actualmente por el nuevo resultado.

Adjunto el proyecto por si fuera de utilidad :D

¡Saludos!