<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MIKE &#187; SQL Server</title>
	<atom:link href="http://helios.ca/category/server/sql-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://helios.ca</link>
	<description>Just another developer blog</description>
	<lastBuildDate>Thu, 10 Jun 2010 15:02:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ASP.NET MVC and Localization</title>
		<link>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/</link>
		<comments>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/#comments</comments>
		<pubDate>Wed, 27 May 2009 20:50:15 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Active Directory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Developement]]></category>
		<category><![CDATA[Globalization]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Photoshop]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://helios.ca/?p=65</guid>
		<description><![CDATA[I live in Montreal &#8211; Canada, and here we have two officials languages, French and English, that&#8217;s why every website I build must be available in both languages. Building an ASP.NET MVC Website using Localization/Globalization is fairly simple and is pretty much like doing it on a plain old ASP.NET Website. We will start this [...]]]></description>
			<content:encoded><![CDATA[<p>I live in Montreal &#8211; Canada, and here we have two officials languages, French and English, that&#8217;s why every website I build must be available in both languages. Building an ASP.NET MVC Website using Localization/Globalization is fairly simple and is pretty much like doing it on a plain old ASP.NET Website.</p>
<p>We will start this example from a blanc ASP.NET MVC Website. This will be easier for you to follow. Now that you have your new ASP.NET MVC Website, create a new class and name it <strong>SetCultureAttribute.cs</strong> in a new <strong>ActionFilter</strong> directory and paste this code inside of it.</p>
<pre class="csharp" name="code">
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.ActionFilter
{
    public class SetCultureAttribute : FilterAttribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext
            filterContext)
        {
            string cultureCode = SetCurrentLanguage(filterContext);

            if (string.IsNullOrEmpty(cultureCode)) return;

            HttpContext.Current.Response.Cookies.Add(
                new HttpCookie("Culture", cultureCode)
                {
                    HttpOnly = true,
                    Expires = DateTime.Now.AddYears(100)
                }
            );

            filterContext.HttpContext.Session["Culture"] = cultureCode;

            CultureInfo culture = new CultureInfo(cultureCode);
            System.Threading.Thread.CurrentThread.CurrentCulture =
                culture;
            System.Threading.Thread.CurrentThread.CurrentUICulture =
                culture;
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }

        private static string GetCookieCulture(ActionExecutingContext
            filterContext, ICollection<string> Cultures)
        {
            /* Get the language in the cookie*/
            HttpCookie userCookie = filterContext.RequestContext
                                                .HttpContext
                                                .Request
                                                .Cookies["Culture"];

            if (userCookie != null)
            {
                if (!string.IsNullOrEmpty(userCookie.Value))
                {
                    if (Cultures.Contains(userCookie.Value))
                    {
                        return userCookie.Value;
                    }
                    return string.Empty;
                }
                return string.Empty;
            }
            return string.Empty;
        }

        private static string GetSessionCulture(ActionExecutingContext
            filterContext, ICollection<string> Cultures)
        {
            if (filterContext.RequestContext.HttpContext
                                               .Session["Culture"]
                                                             != null)
            {
                string SessionCulture = filterContext.RequestContext
                                                .HttpContext
                                                .Session["Culture"]
                                                .ToString();

                if (!string.IsNullOrEmpty(SessionCulture))
                {
                    return Cultures.Contains(SessionCulture)
                                 ? SessionCulture
                                 : string.Empty;
                }
                return string.Empty;
            }
            return string.Empty;
        }

        private static string GetBrowserCulture(ActionExecutingContext
            filterContext, IEnumerable<string> Cultures)
        {
            /* Gets Languages from Browser */
            IList<string> BrowserLanguages = filterContext.RequestContext
                                                         .HttpContext
                                                         .Request
                                                         .UserLanguages;

            foreach (var thisBrowserLanguage in BrowserLanguages)
            {
                foreach (var thisCultureLanguage in Cultures)
                {
                    if (thisCultureLanguage != thisBrowserLanguage)
                        continue;

                    return thisCultureLanguage;
                }
            }
            return string.Empty;
        }

        private static string SetCurrentLanguage(ActionExecutingContext
             filterContext)
        {
            IList<string> Cultures = new List<string>
            {
                "en-CA",
                "fr-CA"
            };

            string CookieValue = GetCookieCulture(
                                            filterContext,
                                            Cultures);

            if (string.IsNullOrEmpty(CookieValue))
            {
                string SessionValue = GetSessionCulture(
                                                  filterContext,
                                                  Cultures);

                if (string.IsNullOrEmpty(SessionValue))
                {
                    string BrowserCulture = GetBrowserCulture(
                                                         filterContext,
                                                         Cultures);
                    return string.IsNullOrEmpty(BrowserCulture)
                             ? "en-CA"
                             : BrowserCulture;
                }
                return SessionValue;
            }
            return CookieValue;
        }
    }
}
</pre>
<p>Once this is done, we need to tell our controllers to use this attribute, to do this we could simply go on top of every controller and decorate it with <strong>[SetCulture]</strong> attribute. The down side with this is that we want the complete site multicultural, not just a few controllers or actions. To fix this problem we&#8217;ll make a <strong>BaseController</strong> which will inherit Controller and will be inherited from all our controllers.</p>
<p>To do this, create a new directory and name it <strong>Infrastructure </strong>and then add a new class called <strong>BaseController.cs</strong> in it. This class should contain the following code:</p>
<pre class="csharp" name="code">
using System.Web.Mvc;
using MvcApplication1.ActionFilter;

namespace MvcApplication1.Infrastructure
{
    [SetCulture]
    public class BaseController : Controller
    {
         // Anything you put here will be accessible
         // in every controllers
    }
}
</pre>
<p>As I said before, we need to tell every controllers to use BaseController, so open every controllers and change the inheritance from Controller to BaseController. As of now, your website knows how to handle localization!!! </p>
<p>What we need now, is a way to switch between french and english&#8230; To do this I simply created a new ASP.NET MVC View User Controller (CultureUserControl.ascx) in Views/Shared with the following code.</p>
<pre class="csharp" name="code">
<% if (Session["Culture"].ToString() == "en-CA") {%>
    <a href="/Home/SetCulture/fr-CA">[ Français ]</a>
<% } else if (Session["Culture"].ToString() == "fr-CA") { %>
    <a href="/Home/SetCulture/en-CA">[ English ]</a>
<% } %>
</pre>
<p>Then I added it to the masterpage, right next to the Log On link.</p>
<pre class="csharp" name="code">
<div id="logindisplay">
    <% Html.RenderPartial("LogOnUserControl"); %>
    <% Html.RenderPartial("CultureUserControl"); %>
</div>
</pre>
<p>Last, but not least, add a new <strong>Global.resx</strong> and <strong>Global.fr.rex</strong> in the App_GlobalResources folder. You can start with the welcome message in About &#8211; Index and call it using <strong>Resources.Global.Welcome</strong></p>
<p><img src="http://helios.ca/wp-content/uploads/2009/05/11.jpg" alt="11" title="11" width="547" height="423" class="alignnone size-full wp-image-107" /><img src="http://helios.ca/wp-content/uploads/2009/05/21.jpg" alt="21" title="21" width="547" height="423" class="alignnone size-full wp-image-108" /></p>
<p>You can find a working example of this tutorial <a href="http://helios.ca/wp-content/uploads/2009/05/ASP.NET.MVC.and.ocalization.zip">here</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://helios.ca/2009/05/27/aspnet-mvc-and-localization/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC Forms Authentication with SqlMembershipProvider</title>
		<link>http://helios.ca/2009/04/22/aspnet-mvc-sqlmembershipprovider/</link>
		<comments>http://helios.ca/2009/04/22/aspnet-mvc-sqlmembershipprovider/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 01:16:57 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#.NET]]></category>
		<category><![CDATA[Developement]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://helios.ca/?p=84</guid>
		<description><![CDATA[The ASP.NET MVC Website Template comes pre-configured to use SqlMembershipProvider which manages storage of membership information for an ASP.NET application in a SQL Server database. But before you can use this properly you will need to setup your database, which will be very easy because Microsoft shipped .NET 2.0 with a nice utility to do [...]]]></description>
			<content:encoded><![CDATA[<p>The ASP.NET MVC Website Template comes pre-configured to use SqlMembershipProvider which manages storage of membership information for an ASP.NET application in a SQL Server database.</p>
<p>But before you can use this properly you will need to setup your database, which will be very easy because Microsoft shipped .NET 2.0 with a nice utility to do it! You can find this on your computer, at this path<em> C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe</em></p>
<p><img class="alignnone size-full wp-image-89" title="1" src="http://helios.ca/wp-content/uploads/2009/05/1.jpg" alt="1" width="580" height="450" /></p>
<p>Your database should have these tables:</p>
<p><img class="alignnone size-full wp-image-90" title="2" src="http://helios.ca/wp-content/uploads/2009/05/2.jpg" alt="2" width="269" height="205" /></p>
<p>Now lets tell our ASP.NET MVC Website&#8217;s configuration where to find this database. Open the web.config and change the ApplicationServices connection string to point to your SQL Server. You should now rebuild your solution to avoid any problems in the next step!</p>
<pre class="xml" name="code">&lt;connectionStrings&gt;
    &lt;add name="ApplicationServices"
         connectionString="Data Source=localhost;
                           Initial Catalog=database;
                           Persist Security Info=True;
                           User ID=user;
                           Password=password"
         providerName="System.Data.SqlClient"
    /&gt;
&lt;/connectionStrings&gt;</pre>
<p>It&#8217;s all good and nice but now we need Users in this database otherwise it&#8217;s completly useless! So open up your ASP.NET MVC Solution in Visual Studio and go to <strong>Project » ASP.NET Configuration</strong>. This will open the ASP.NET Web Application Administration website. In the Security tab you can Add/Manage Users and Roles. For the moment, add a user so we can try the login. I&#8217;ve added user <strong>Mike</strong>.</p>
<p><img class="alignnone size-full wp-image-91" title="3" src="http://helios.ca/wp-content/uploads/2009/05/3.jpg" alt="3" width="527" height="507" /></p>
<p>You can now run your application and click on [ Log On ] at the top right corner of the page, this will redirect you the the logon form.</p>
<p><img class="alignnone size-full wp-image-92" title="4" src="http://helios.ca/wp-content/uploads/2009/05/4.jpg" alt="4" width="515" height="516" /></p>
<p>If you entered the correct credential you should be redirected to the home page of the site and you will see your name and a Log Off button instead of the Log On button.</p>
<p><img class="alignnone size-full wp-image-93" title="5" src="http://helios.ca/wp-content/uploads/2009/05/5.jpg" alt="5" width="517" height="267" /></p>
<p>Well congraticulations! You now have SqlMembershipProvider working on your website, wasn&#8217;t so hard, was it? Not a single line of code required! I&#8217;ll be posting again soon to show you how to use Roles in your applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://helios.ca/2009/04/22/aspnet-mvc-sqlmembershipprovider/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SQL Server 2008 &#8211; Saving changes is not permitted</title>
		<link>http://helios.ca/2008/09/15/sql-server-2008-saving-changes-is-not-permitted/</link>
		<comments>http://helios.ca/2008/09/15/sql-server-2008-saving-changes-is-not-permitted/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 02:25:32 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://helios.ca/?p=53</guid>
		<description><![CDATA[I recently started using SQL Server 2008, at first it was really nice, but then I started getting a weird error every time I tried modifying a table. Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes to a table [...]]]></description>
			<content:encoded><![CDATA[<p>I recently started using SQL Server 2008, at first it was really nice, but then I started getting a weird error every time I tried modifying a table.</p>
<blockquote><p><em>Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes to a table that can&#8217;t be re-created or enabled the option Prevent saving changes that require the table to be re-created.</em></p></blockquote>
<p>This is really annoying because you cannot add relationship to your tables once your created them! Luckily all we need to do to correct this error is change an option in SQL Management Studio.</p>
<p>Go to <strong>Tools </strong>» <strong>Options </strong>» <strong>Designers </strong>and Uncheck &#8220;Prevent saving changes that require table re-creation&#8221;</p>
<p><img class="alignnone size-full wp-image-56" title="1" src="http://helios.ca/wp-content/uploads/2009/05/1.png" alt="1" width="590" height="343" /></p>
<p>That should do the trick!</p>
]]></content:encoded>
			<wfw:commentRss>http://helios.ca/2008/09/15/sql-server-2008-saving-changes-is-not-permitted/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
