SSIS: Comparing two versions of same package

SQL Server Integration Services yields a very bitter experience when comparing two versions of a package to see the differences. The problem is that the package XML is arbitrarily reordered when we try to save a package in the Visual Studio designer. Well, luckily, there’s a free and very nice solution to this problem: BIDS helper, a Visual Studio add-on that leverages BI development using SQL Server 2005/2008. SmartDiff is a part of BIDs helper and it compares two packages after pre-processing the package definition files and producing a uniform layout for comparison.

To demonstrate, let me show the result of two versions of one of my SSIS packages. I did not modify anything and just saved the same package twice. Here’s a summary for an ordinary diff that shows how the VS designer messes up the two versions:

Summary of ordinary diff

Using SmartDiff, here’s the result:

Summary after SmartDiff

Looks great, only two differences. Here’s the actual output from SmartDiff: Click to enlarge the image:

Actual Diff using SmartDiff

That’s really cool. BIDs helper is an add-on every BI developer must have. It contains many other features other than SmartDiff. Have a try here.

Advertisements

IValueConverters: A great tool in developing WPF/Silverlight applications

IValueConverters in WPF/Silverlight are a very powerful tool in UI presentation, especially, when following the MVVM pattern. In MVVM, where everything in the View is bounded to some property from ViewModel, IValueConverters come handy because often the properties in the ViewModel do not necessarily return the same data type that the View needs. For instance, we can have a boolean IsVisible property in the ViewModel but the UI controls need a Visibility enumeration (with values Visibility.Collapsed and Visibility.Visible) to properly consume it. The great thing about IValueConverters is that they take an object and return an object, so its upto the innovation of developer to make the most out of them.

In this post, I will be demonstrating the powers of IValueConverters by representing a simple boolean variable, that has just two possible values, in several ways. Here’s a screenshot from the application. The bindings in the left column are two way, thus the change in any one of the controls is immediately reflected in the whole view. Have a look:

ivalueconvertersdemo

The ViewModel class exposes only one boolean property to the View. Here’s the code:

public class SampleViewModel : System.ComponentModel.INotifyPropertyChanged
{
    bool boolProperty;

    public bool BoolProperty
    {
        get { return boolProperty; }
        set { boolProperty = value; RaisePropertyChanged("BoolProperty"); }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    }

}

The View consumes the boolean property using:

  • Default Boolean To String Converter (with Values = True, False)
  • Boolean to String Converter (with values = Yes, No)
  • Boolean to String Converter (with values = Start, Stop)
  • Boolean to Brush Converter (with colors Green, Red)
  • Boolean to Opacity Converter (with opacity 100%, 10%)
  • Boolean to FontStyle Converter (with styles Normal, Italic)
  • Boolean to Visibility Converter

Here’s the code for the View:

<UserControl x:Class="IValueConvertersDemo.View.SampleView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:IValueConvertersDemo.ViewModels"
    xmlns:converter="clr-namespace:IValueConvertersDemo.Converters"
    >
    <UserControl.Resources>
        <vm:SampleViewModel x:Key="ViewModel" BoolProperty="True" />
        <converter:BoolToColorConverter x:Key="BoolToColorConverter" />
        <converter:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
        <converter:BoolToStringConverter x:Key="BoolToStringConverter" />
        <converter:BoolToDoubleConverter x:Key="BoolToDoubleConverter" />
        <converter:BoolToFontStyleConverter x:Key="BoolToFontStyleConverter" />
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" DataContext="{StaticResource ViewModel}" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="250" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0" Margin="10" HorizontalAlignment="Left">
            <TextBlock Margin="10" FontSize="18" Text="Two-way" />
            <CheckBox Margin="10" Content="BoolProperty" IsChecked="{Binding BoolProperty, Mode=TwoWay}" />
            <TextBox Margin="10" Width="100" Text="{Binding BoolProperty, Mode=TwoWay}" />
            <TextBox Margin="10" Width="100" Text="{Binding BoolProperty, Mode=TwoWay, Converter={StaticResource BoolToStringConverter}, ConverterParameter='Yes,No'}" />
            <TextBox Margin="10" Width="100" Text="{Binding BoolProperty, Mode=TwoWay, Converter={StaticResource BoolToStringConverter}, ConverterParameter='Start,Stop'}" />
        </StackPanel>

        <StackPanel Grid.Column="1"  Margin="10">
            <TextBlock Margin="10" FontSize="18" Text="One-way" />
            <StackPanel Margin="10" Orientation="Horizontal">
                <Ellipse Height="50" Width="50" Fill="{Binding BoolProperty, Converter={StaticResource BoolToColorConverter}}" HorizontalAlignment="Left" />
                <TextBlock Margin="5" VerticalAlignment="Center" Text="Color(Green/Red) depending on bool property" />
            </StackPanel>
            <StackPanel Margin="10" Orientation="Horizontal">
                <Rectangle Fill="Blue" Height="50" Width="50" Opacity="{Binding BoolProperty, Converter={StaticResource BoolToDoubleConverter}}" HorizontalAlignment="Left" />
                <TextBlock Margin="5" VerticalAlignment="Center" Text="Opacity(100%/10%) depending on bool property" />
            </StackPanel>
            <TextBlock Margin="10" Text="Fontstyle(Normal/Italic) depending on bool property" FontStyle="{Binding BoolProperty, Converter={StaticResource BoolToFontStyleConverter}}" />
            <TextBlock Margin="10" Text="This text is visible only if bool value is true" Visibility="{Binding BoolProperty, Converter={StaticResource BoolToVisibilityConverter}}" />
        </StackPanel>

    </Grid>
</UserControl>

Notice that a boolean variable can only be assigned two values: True and False. Yet, still, we are able to use that in several different ways. Thus IValueConverters provide endless possibilities in WPF data presentation. Its only upto the brain of developer how to exploit them.

The sourcecode for the various converters is included with the sample application that can be downloaded here. Make sure you rename the file to .zip for extraction.