Generate Custom Business Object Properties from SQL Server Tables
In the never ending debate between using datasets and using custom business objects (CBOs), one of the main knocks on CBOs is that they take more time to code. You have to write the properties and create getters and setters for each, code the DB calls, etc.
Of course, you could always get yourself a code generator but those cost money. On the other hand, Sql Server 2005 has made this a little easier with some System Views. Look at the Information_Schema views and you’ll find a whole bunch of really nice info. The one we’re going to use today is the Columns view.
The first steps we need is to be able to convert from Sql datatypes to .Net types. This handy little Sql function will do our conversion for us. You can simply delete the function when our done generating.
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Create date: 03/15/2007 -- Description: Returns the correct Net datatype -- from Sql datatype -- ============================================= CREATE FUNCTION GetNetDataType( @SqlDataType nvarchar(128) ) RETURNS nvarchar(128) AS BEGIN -- Declare the return variable here DECLARE @NetDataType nvarchar(128) SELECT @NetDataType = CASE WHEN @SqlDataType = 'varbinary' THEN 'Byte[]' WHEN @SqlDataType = 'binary' THEN 'Byte[]' WHEN @SqlDataType = 'varchar' THEN 'String' WHEN @SqlDataType = 'char' THEN 'String' WHEN @SqlDataType = 'nvarchar' THEN 'String' WHEN @SqlDataType = 'nchar' THEN 'String' WHEN @SqlDataType = 'text' THEN 'String' WHEN @SqlDataType = 'ntext' THEN 'String' WHEN @SqlDataType = 'uniqueidentifier' THEN 'Guid' WHEN @SqlDataType = 'rowversion' THEN 'Byte[]' WHEN @SqlDataType = 'bit' THEN 'Boolean' WHEN @SqlDataType = 'tinyint' THEN 'Byte' WHEN @SqlDataType = 'smallint' THEN 'Int16' WHEN @SqlDataType = 'int' THEN 'Integer' WHEN @SqlDataType = 'bigint' THEN 'Int64' WHEN @SqlDataType = 'smallmoney' THEN 'Decimal' WHEN @SqlDataType = 'money' THEN 'Decimal' WHEN @SqlDataType = 'numeric' THEN 'Decimal' WHEN @SqlDataType = 'decimal' THEN 'Decimal' WHEN @SqlDataType = 'real' THEN 'Single' WHEN @SqlDataType = 'float' THEN 'Double' WHEN @SqlDataType = 'smalldatetime' THEN 'DateTime' WHEN @SqlDataType = 'datetime ' THEN 'DateTime' END RETURN @NetDataType END GO
Now we can run a query against Information_Schema.Columns to get the columns of our table and gen the code for the properties. I’ve included VB and C# codes. It may be easier to get the code from the Text (Ctrl-T) of the result window rather than the grid view (Ctrl-D).
DECLARE @CRLF as varchar(2) Set @CRLF = CHAR(13) + CHAR(10) DECLARE @TAB as varchar(2) Set @TAB = CHAR(9) -- This produces VB code SELECT 'private m' + Column_Name + ' as ' + dbo.GetNetDataType(data_type) + @CRLF + 'Public Property ' + Column_Name + ' as ' + + dbo.GetNetDataType(data_type) + @CRLF + 'Get' + @CRLF + 'return m' + Column_Name + @CRLF + 'End Get' + @CRLF + 'Set(value as ' + dbo.GetNetDataType(data_type) + ')' + @CRLF + 'm' + Column_Name + ' = value ' + @CRLF + 'End Set' + @CRLF + 'End Property' + @CRLF + @CRLF FROM information_schema.columns WHERE Table_Name = 'MyTable' ORDER BY Column_Name -- This produces C# code SELECT @TAB + 'private ' + dbo.GetNetDataType(data_type) + ' m' + Column_Name + ';' + @CRLF + @TAB + 'public ' + dbo.GetNetDataType(data_type) + ' ' + Column_Name + ' {' + @CRLF + @TAB + @TAB + 'get {' + @CRLF + @TAB + @TAB + @TAB + 'return m' + Column_Name + ';' + @CRLF + @TAB + @TAB + '}' + @CRLF + @TAB + @TAB + 'set { ' + @CRLF + @TAB + @TAB + @TAB + 'm' + Column_Name + ' = value;' + @CRLF + @TAB + @TAB + '}' + @CRLF + @TAB + '}' + @CRLF + @CRLF FROM information_schema.columns WHERE Table_Name = 'MyTable' ORDER BY Column_Name
Comments