ASP.NET Podcast

ASP.NET Podcast is geared towards the Microsoft .NET Framework and ASP.NET.
The podcast is run by Wally McClure, David Penton, and Paul Glavich.
Welcome to ASP.NET Podcast Sign in | Join | Help
in Search

ASP.NET Podcast

The ASP.NET Podcast features, technical talks, interviews, news, reviews, and Wallyisms. Wallace B. (Wally) McClure, David Penton, and Paul Glavich are your hosts. We talk about ASP.NET, AJAX, Performance, Databases, WCF, Silverlight, Cloud Computing, Windows Azure, and whatever else we decide to talk about.

ASP.NET Podcast Show #133 - Windows Azure Table Storage - video

Subscribe to All!

Subscribe to WMV.

Subscribe to M4V (iPod).

Subscribe to MP3.

Download WMV.

Download M4V (iPod).

Download MP3.

Win a ticket to the MDC in Detroit.  Enter here. 

Show Notes:

  • CRUD Application
  • CRUD application.
  • Message.
  • Message Data Service Context.
  • This example is taken from Hands On Labs.

Source Code for Default.aspx.cs:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.Services.Client;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Microsoft.Samples.ServiceHosting.StorageClient;
using Microsoft.ServiceHosting.ServiceRuntime;

namespace TableCloudService_WebRole
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string statusMessage = String.Empty;
            if (!Page.IsPostBack)
            {
                DisplayMessages();
            }
        }

        protected void lbDisplayMessages_Click(object sender, EventArgs e)
        {
            DisplayMessages();
        }

        protected void OnDeleteMessage(object sender, CommandEventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            GridViewRow gvr = (GridViewRow)lb.Parent.Parent;

            if (e.CommandName == "Delete")
            {
                string PartitionKey = ((HiddenField)gvr.FindControl("hdPartitionKey")).Value;
                string RowKey = ((HiddenField)gvr.FindControl("hdRowKey")).Value;
                string TimeStamp = ((HiddenField)gvr.FindControl("hdTimeStamp")).Value;
                string Body = ((TextBox)gvr.FindControl("txtBody")).Text;
                string Name = ((TextBox)gvr.FindControl("txtName")).Text;
                MessageDataServiceContext context = GetContext();

                //var m = (from mess in context.Messages
                //         where
                //             (mess.PartitionKey == PartitionKey) &&
                //             (mess.RowKey == RowKey)
                //         select mess).Single();
                var m = new Message();
                m.PartitionKey = PartitionKey;
                m.RowKey = RowKey;
                m.Timestamp = Convert.ToDateTime(TimeStamp);
                context.AttachTo("Messages", m, "*");
               
                context.DeleteMessage(m);
                RoleManager.WriteToLog("Verbose", "Delete Message.");
                DisplayMessages();
            }
        }
        protected void OnUpdateMessage(Object sender, CommandEventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            GridViewRow gvr = (GridViewRow)lb.Parent.Parent;

            if (e.CommandName == "Update")
            {
                string PartitionKey = ((HiddenField)gvr.FindControl("hdPartitionKey")).Value;
                string RowKey = ((HiddenField)gvr.FindControl("hdRowKey")).Value; ;
                string TimeStamp = ((HiddenField)gvr.FindControl("hdTimeStamp")).Value; ;
                string Body = ((TextBox)gvr.FindControl("txtBody")).Text; ;
                string Name = ((TextBox)gvr.FindControl("txtName")).Text; ;
                MessageDataServiceContext context = GetContext();

                //var m = (from mess in context.Messages
                //         where
                //             (mess.PartitionKey == PartitionKey) &&
                //             (mess.RowKey == RowKey)
                //         select mess).First();
                var m = new Message();
                m.PartitionKey = PartitionKey;
                m.RowKey = RowKey;
                m.Timestamp = Convert.ToDateTime(TimeStamp);
                m.Body = Body;
                m.Name = Name;
                context.AttachTo("Messages", m, "*");
                context.UpdateMessage(m);
                RoleManager.WriteToLog("Information",  "Update complete.");
                DisplayMessages();
            }
        }

        protected void Timer1_OnTick(Object sender, EventArgs e)
        {
            DisplayMessages();
        }

        private void DisplayMessages()
        {
            MessageDataServiceContext context = GetContext();
            RoleManager.WriteToLog("Verbose", "Display Messages.");
            messageList.DataSource = context.Messages.Take(10);
            messageList.DataBind();
        }

        private MessageDataServiceContext GetContext()
        {
            MessageDataServiceContext context;
            StorageAccountInfo accountInfo = StorageAccountInfo.GetAccountInfoFromConfiguration("TableStorageEndpoint");
            TableStorage.CreateTablesFromModel(typeof(MessageDataServiceContext), accountInfo);
            context = new MessageDataServiceContext(accountInfo);
            RoleManager.WriteToLog("Verbose", "Message Data Service Context created.");
            return context;
        }

        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            StorageAccountInfo accountInfo = StorageAccountInfo.GetAccountInfoFromConfiguration("TableStorageEndpoint");
            MessageDataServiceContext context = new MessageDataServiceContext(accountInfo);
            context.AddMessage(this.nameBox.Text, this.messageBox.Text);
            nameBox.Text = String.Empty;
            messageBox.Text = String.Empty;
            DisplayMessages();
        }
    }
}

Source Code for Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TableCloudService_WebRole._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Azure Table Example Page</title>
        <style type="text/css">
        body { font-family: Verdana; font-size: 9pt; }
        h1 { font-size: 12pt; color: #555555; }
        li { list-style-type: none; }
        form { background-color: #eeeeff; width: 80%; margin: 0 auto; padding: 1em; border: solid 1px #333333; }
        #entryform, #messages { margin: 1em 0 }
        #entryform li span { float: left; width: 15%; color:#333333; margin-top:0.25em; }
        #entryform input[type="text"] { border: solid 1px #999999; }
        #messages { border: solid 1px #999999; }
        #messages li { padding: 0.5em; }
        .error { color: #ff0000; }
        .even { background-color: #ccccff; }
        .odd { background-color: #ffffff; font-style: italic; }       
        .messageBox { width: 73%; }
    </style>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="sm" runat="server" />
    <div>
        <h1>Windows Azure Chat</h1>
        <ul id="entryform">
            <li><span>Your name</span><asp:TextBox ID="nameBox" runat="server" Text="Anonymous" /></li>
            <li><span>Message</span><asp:TextBox ID="messageBox" runat="server" CssClass="messageBox" /> <asp:Button ID="submitButton" runat="server" Text="Submit" OnClick="SubmitButton_Click" /></li>
            <li><span><asp:LinkButton ID="lbDisplayMessages" runat="server" OnClick="lbDisplayMessages_Click" Text="Update Messages" /></span></li>
        </ul>
                <div>
                    <asp:Label ID="status" runat="server" CssClass="error" />
                </div>
                <asp:GridView ID="messageList" runat="server" AutoGenerateColumns="false">
                    <AlternatingRowStyle CssClass="even" />
                    <RowStyle CssClass="odd" />
                    <Columns>
                    <asp:TemplateField HeaderText="Name">
                    <ItemTemplate>
                        <asp:HiddenField ID="hdPartitionKey" runat="server" Value='<%#Eval("PartitionKey") %>' />
                        <asp:HiddenField ID="hdRowKey" runat="server" Value='<%#Eval("RowKey") %>' />
                        <asp:HiddenField ID="hdTimeStamp" runat="server" Value='<%#Eval("TimeStamp") %>' />
                        <asp:HiddenField ID="hdName" runat="server" Value='<%#Eval("Name") %>' />
                        <asp:HiddenField ID="hdBody" runat="server" Value='<%#Eval("Body") %>' />
                        <asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>' />
                        said:
                    </ItemTemplate>
                    </asp:TemplateField>                   
                    <asp:TemplateField HeaderText="Message">
                    <ItemTemplate>
                        <asp:TextBox ID="txtBody" runat="server" Text='<%# Eval("Body") %>' />
                    </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Operations">
                    <ItemTemplate>
                        <asp:LinkButton ID="updateMessage"
                            CommandName="Update"
                            runat="server" Text="Update" OnCommand="OnUpdateMessage" />
                        <asp:LinkButton ID="deleteMessage"
                            OnClientClick="return confirm('Delete Message?');"
                            CommandName="Delete"
                            runat="server" Text="Delete" OnCommand="OnDeleteMessage" />               
                    </ItemTemplate>
                    </asp:TemplateField>
                    </Columns>
                </asp:GridView>
    </div>
    </form>
</body>
</html>

Source for Message.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Samples.ServiceHosting.StorageClient;

namespace TableCloudService_WebRole
{
    public class Message : TableStorageEntity
    {
        //private string PartitionKey;
        //private string RowKey;
        public string Name { get; set; }
        public string Body { get; set; }

        public Message()
        {
            PartitionKey = "a";
            RowKey = String.Format("{0:10},{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks,
                Guid.NewGuid().ToString());
        }
    }
}

Source for MessageDataServiceContext.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Samples.ServiceHosting.StorageClient;

namespace TableCloudService_WebRole
{
    public class MessageDataServiceContext : TableStorageDataServiceContext
    {
        public MessageDataServiceContext(StorageAccountInfo accountInfo) : base(accountInfo)
        {
        }

        public IQueryable<Message> Messages
        {
            get
            {
                return this.CreateQuery<Message>("Messages");
            }
        }

        public void AddMessage(string name, string body)
        {
            Message MessageEntity = new Message { Name = name, Body = body };
            this.AddObject("Messages", MessageEntity);
            this.SaveChanges();
        }

        public void DeleteMessage(Object MessageEntity)
        {
            this.DeleteObject(MessageEntity);
            this.SaveChanges();
        }

        public void UpdateMessage(Object MessageEntity)
        {
            this.UpdateObject(MessageEntity);
            this.SaveChanges();
        }
    }
}

Normal 0 false false false EN-US X-NONE X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;}

Published Thursday, December 25, 2008 5:01 AM by admin
Anonymous comments are disabled

This Blog

Syndication

Powered by Community Server, by Telligent Systems