.Net Code Monkey RSS 2.0
 Thursday, January 05, 2012
Constructors Continued from Part 1...

We will need a series of constructors which will be used when we create Widening Operators, later. The first we aill use will accept a parameter value for ticks as an Int64. We will set the date using our InternalDate property as this will handle setting the inherited _isNull field for us.
    ''' <summary>
    ''' Initializes a new instance of the <see cref="DateTimeNull" /> class to a specified number of ticks.
    ''' </summary>
    ''' <param name="ticks">The ticks.</param>
    Public Sub New(ByVal ticks As Long)
        MyBase.New()
        Me.InternalDate = New System.DateTime(ticks)
    End Sub
The next constructor will take a System.DateTime parameter to construct our object.
    ''' <summary>
    ''' Initializes a new instance of the <see cref="DateTimeNull" /> class using the specified System.DateTime value.
    ''' </summary>
    ''' <param name="value">The value.</param>
    Public Sub New(ByVal value As System.DateTime)
        Me.New(value.Ticks)
    End Sub
The following constructor will take a System.Data.SqlTypes.SqlDateTime parameter to construct our object.
    ''' <summary>
    ''' Initializes a new instance of the <see cref="DateTimeNull" /> class using the specified System.Data.SqlTypes.SqlDateTime value.
    ''' </summary>
    ''' <param name="value">The value.</param>
    Public Sub New(ByVal value As System.Data.SqlTypes.SqlDateTime)
        MyBase.New()
        Dim dt As System.DateTime
        dt = Convert.ToDateTime(value)
        Me.InternalDate = dt
    End Sub
The last constructor will take a System.DBNull to construct or object.

    ''' <summary>
    ''' Initializes a new instance of the <see cref="DateTimeNull" /> class using a system.DBNull object.
    ''' </summary>
    ''' <param name="value">The value.</param>
    Public Sub New(ByVal value As System.DBNull)
        Me.New(System.DateTime.MinValue)
        If Not Me.IsNull Then
            Me.SetIsNull(True)
        End If
    End Sub
With our constructors done we will take a quick look at some of the properties which may be useful. Each property will reflect one of the properties that the .Net System.Datetime object has. Reflector is a useful tool for investigating these. Each property will expose the underlying InternalDate's properties, but first it must check if our object is in the NULL state. I have included just a few properties so you can see the pattern used.
    ''' <summary>
    ''' Gets the date component of this instance.
    ''' </summary>
    ''' <value>A new DateTime with the same date as this instance, and the time value set to 12:00:00 midnight (00:00:00).</value>
    ''' <exception cref="ArgumentNullException">Thrown</exception>
    Public ReadOnly Property [Date]() As DateTimeNull
        Get
            If Me.HasValue Then
                Return New DateTimeNull(Me.InternalDate.Date)
            Else
                Throw New ArgumentNullException("Date cannot be returned for a null DateTimeNull")
            End If
        End Get
    End Property

    ''' <summary>
    ''' Gets the day of the month represented by this instance.
    ''' </summary>
    ''' <remarks>The day component, expressed as a value between 1 and 31.</remarks>
    Public ReadOnly Property Day() As System.Int32
        Get
            If Me.HasValue Then
                Return Me.InternalDate.Day
            Else
                Throw New NullReferenceException("Day cannot be expressed for a null DateTimeNull object. ")
            End If
        End Get
    End Property

    ''' <summary>
    ''' Gets the hour component of the date represented by this instance.
    ''' </summary>
    ''' <returns>The hour component, expressed as a value between 0 and 23, inclusive.</returns>
    Public ReadOnly Property Hour() As System.Int32
        Get
            If Me.HasValue Then
                Return Me.InternalDate.Hour
            Else
                Throw New NullReferenceException("Hour cannot be expressed for a null DateTimeNull object. ")
            End If
        End Get
    End Property

    ''' <summary>
    ''' Gets a System.DateTime object that is set to the current date and time on this computer, expressed as the local time.
    ''' </summary>
    ''' <returns>A DateTime whose value is the current local date and time.</returns>
    Public Shared ReadOnly Property Now() As DateTime
        Get
            Return DateTime.UtcNow.ToLocalTime
        End Get
    End Property

    ''' <summary>
    ''' Gets the current date.
    ''' </summary>
    '''<returns>A DateTime set to today's date, with the time component set to 00:00:00.</returns>
    Public Shared ReadOnly Property Today() As DateTime
        Get
            Return DateTime.Now.Date
        End Get
    End Property

Over time I will add more properties to my DateTimeNull object, as they are required. Next however, it is time to look at Operators. This will be in Part 3.

Thursday, January 05, 2012 1:21:05 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] -
.Net | Asp.Net | VB.Net | Widening Operators
 Wednesday, January 04, 2012

Background

Something I have always been a bit disappointed with in .net is the handling for dates with null values. I know you can use Nullable(Of Date) or Nullable(Of DateTime) (or i C# date? or Datetime?), but what I want is a date object that I can set a date value, set to Nothing or set to be equal to DBNull.Value.

So I thought I would document my path to creating the object I need. The code will be in VB.Net as that is what I curently have to use at my place of work.

Nullable Base Object.

First of all as I may need other objects like Int32s and Strings to be nullable in the future I'll create a nullable base object which all my new objects can inherit from and will contain some basic implementation. First I am going to create a class and declare it MustInherit (abstract)so that cannot be used on its own. This will be the base object that any or all of my nullable objects will inherit from.

Option Explicit On
Option Strict On

''' <summary>
''' This object is the object that all nullable objects should inherit from.
''' </summary>
Public MustInherit Class NullableBaseObject
    Implements System.Data.SqlTypes.INullable

#Region "Declarations"

    Protected _isNull As Boolean

#End Region

#Region "Properties"

    ''' <summary>
    ''' Gets a value indicating whether this instance has value.
    ''' </summary>
    ''' <value><c>true</c> if this instance has value; otherwise, false.</value>
    Public ReadOnly Property HasValue() As Boolean
        Get
            Return Not Me._isNull
        End Get
    End Property

    ''' <summary>
    ''' Gets a value indicating whether this instance is null.
    ''' </summary>
    ''' <value><c>true</c> if this instance is null; otherwise, false.</value>
    Public ReadOnly Property IsNull() As Boolean Implements System.Data.SqlTypes.INullable.IsNull
        Get
            Return Me._isNull
        End Get
    End Property

#End Region

#Region "Methods"

    ''' <summary>
    ''' Sets the internal is-null flag.
    ''' </summary>
    ''' <param name="value">if set to <c>true</c> [value].
    Protected Sub SetIsNull(ByVal value As Boolean)
        Me._isNull = value
    End Sub 

#End Region

End Class

There is a private boolean field _isNull which will hold the nullable state of the object. There are two properties that refer to this; IsNull and HasValue. These are in essence opposites of each other but have both been implemented to make the code more English when using. The IsNull property is implementation required from the "System.Data.SqlTypes.INullable" interface that the class is going to implement.

There is one method, The SetIsNull which sets the object state Null and can be called from inside any classes that inherit from this object.

Nullable DateTime Object

The nullable DateTime object will inherit from the NullableBaseObject. There will be a single private field _internalDate of type System.DateTime. This will hold our DateTime information when the object is not Null. This will be accessed by all internal code using a private property InternalDate. Unlike the System.DateTime which is Structure, I want to be able to set this object to Nothing, so I will use a Class, not a Structure.

Option Explicit On
Option Strict On

''' <summary>
''' Represents nullable an instance in time, typically represented as a date and time.
''' </summary>
<serializable()> _
Public Class DateTimeNull
    Inherits NullableBaseObject
    
#Region "Declarations"

    Private _internalDate As System.DateTime

#End Region

#Region "Properties"

    ''' <summary>
    ''' Privately gets or sets the internal date. When set IsNull property is set to false.
    ''' </summary>
    ''' <value>The internal date.</value>
    Private Property InternalDate() As System.DateTime
        Get
            Return Me._internalDate
        End Get
        Set(ByVal value As System.DateTime)
            Me._internalDate = value
            If Me.IsNull Then
                Me.SetIsNull(False)
            End If
        End Set
    End Property

#End Region

End Class
We will provide an overridden ToString() method which will return the default ToString() value for either the System.DateTime object or the System.DBNull.Value, depending if our object is in a Null state or not.
#Region "Methods"

    ''' <summary>
    ''' Converts the value of this instance to its equivalent string representation.
    ''' </summary>
    ''' <returns>
    ''' A <see cref="System.String"> that represents this instance.
    ''' </returns>
    Public Overrides Function ToString() As String
        If Me.HasValue Then
            Return Me.InternalDate.ToString
        Else
            Return DBNull.Value.ToString
        End If
    End Function

#End Region

We will now look at the constructors we wish to use to allow creation of our object. First we'll look at the default constructor.This constructor initialises the base object, and then calls the base object's SetIsNull() method to set a null state.
#Region "Constructors"

    ''' <summary>
    ''' Initializes a new instance of the  class, with IsNull = true.
    ''' </summary>
    Public Sub New()
        MyBase.New()
        Mybase.SetIsNull(True)
    End Sub
    
#End Region

In Part 2, we'll look at adding more constructors that we will need when creating casting operators later.
Wednesday, January 04, 2012 1:20:09 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] -
.Net | Asp.Net | DateTime | Nullable | VB.Net
 Saturday, September 24, 2011

Background

Over the last week I have been periodically trying to get SQl Server 2005 express and SQL Server 2008 express to run side by side. One of the issues is there is a restriction when trying to instal SQL 2008 Express over the top of 2005 with the "SQL 2008 Install Blocked..." message

To get around this I managed to find information on a blog post (I will try to find and post a link to it) explaining how to move the registry entry for 2005, just while installing 2008.

The all inportant registry entry is:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server

Before installing SQL Server 2008 Express rename the '90' node to '90_old' and then install as normal. Once the installation has taken place refersh the node list and yiou will see a new '90' has appeared. Rename that to something else. I chose'70' as I will never be installing SQl Server 7 on this machine! Rename yiour '90_old' back to '90' and restart the machine.

When you install 2008 remember to choose a different instance name than the one you choose for SQL 2005

One thing to note is you may wish to detach your SQL Server 2005 databases first as I now seem to be unable to connect to one of them on my SQL 2005 instance. I need to look into how to reconnect this database!

Update: It turns out that I had to give some more permissions to the database mdf files. I had to add "NETWORK SERVICE" and give it full control. I was then able to detach and reattach the databse and I can now see all databases in both 2005 and 2008 Management Studio Express versions.

Saturday, September 24, 2011 7:56:43 AM (GMT Standard Time, UTC+00:00)  #    Comments [0] -
Database | SQL Server | SQL Server 2005 Express | SQL Server 2008 Express | Windows 7 | Permissions
 Wednesday, April 20, 2011

Due to comment abuse, comments have now been disabled.

 

Sorry.

D.

Wednesday, April 20, 2011 5:29:54 PM (GMT Standard Time, UTC+00:00)  #    Comments [0] -

Archive
<January 2012>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234
Blogroll
 Clemens Vasters
 Harry Pierson
Passion * Technology * Ruthless Competence
 Joshua Flanagan
A .NET Software Developer
 Michael Schwarz's Blog
Developing applications on the Microsoft platform since Windows 3.1!
 Omar Shahine
Yet another Microsoft blogger
 Scot GU
Scott Guthrie lives in Seattle and builds a few products for Microsoft
 Scott Hanselman
Programming Life and the Zen of Computers
 Tom Mertens
Tom's corner
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012
Duane Wingett
Sign In
Statistics
Total Posts: 40
This Year: 5
This Month: 1
This Week: 0
Comments: 39
Themes
Pick a theme:
All Content © 2012, Duane Wingett
DasBlog theme 'Business' created by Christoph De Baene (delarou)