

print '/* ignore this
'
go

SET NOCOUNT ON

DECLARE @TableName nvarchar(128)
DECLARE @TablePrefix nvarchar(20)
DECLARE @BOPrefix nvarchar(20)
DECLARE @CurrentNamespace varchar(128)
DECLARE @ReplacePKWithID bit
DECLARE @IDPropertyName varchar(15)
/* !!!!!!!!!!!!! parameters !!!!!!!!!!!!!*/
SET @BOPrefix = 'C'
SET @TablePrefix = ''
SET @TableName = 'Customers'
SET @CurrentNamespace = 'BusinessObjects'
SET @ReplacePKWithID = 1
SET @IDPropertyName = 'ID'
/*!!!!!!!!!!   parameters !!!!!!!!!!!!!*/


DECLARE @ShortTableName nvarchar(20)
SET @ShortTableName = RIGHT(@TableName, DATALENGTH(@TableName) / 2 - DATALENGTH(@TablePrefix) / 2)
DECLARE @BOName nvarchar(128), @BOCollectionName nvarchar(128)
SET @BOName = @BOPrefix + @ShortTableName
SET @BOCollectionName = @BOPrefix + @ShortTableName + 'Collection'


DECLARE @columns table 
(
	colname nvarchar(128), 
	coldefault nvarchar(4000),
 	isnullable bit, 
	datatype nvarchar(128), 
	collen int
)

DECLARE @pkdatatype nvarchar(128), @pkcollen smallint

INSERT @columns (colname, coldefault, isnullable, datatype, collen)
SELECT COLUMN_NAME, 
 RIGHT(LEFT(COLUMN_DEFAULT, DATALENGTH(COLUMN_DEFAULT) /2 - 1), DATALENGTH(COLUMN_DEFAULT) / 2  - 2),
 (CASE WHEN IS_NULLABLE = 'Yes' THEN 1 ELSE 0 END), DATA_TYPE,
 CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName

DECLARE @colname nvarchar(128), @coldefault nvarchar(4000), @isnullable bit, @datatype nvarchar(128), @collen int, @prefix varchar(10)

-- primary key
IF OBJECT_ID('tempdb..#tmpTpk') IS NOT NULL DROP TABLE #tmpTpk

CREATE TABLE #tmpTpk (TABLE_QUALIFIER sysname, TABLE_OWNER sysname, TABLE_NAME sysname, COLUMN_NAME sysname, KEY_SEQ smallint, PK_NAME sysname)
INSERT #tmpTpk (TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, KEY_SEQ, PK_NAME)
EXEC sp_pkeys @table_name = @TableName

DECLARE @pk nvarchar(128)
SELECT TOP 1 @pk = COLUMN_NAME FROM #tmpTpk

IF ISNULL(@ReplacePKWithID, 0) = 0
	SET @IDPropertyName = @pk

print '
*/
'

DECLARE @sql varchar(8000)


SET @sql = '
using System;
using System.Collections;

namespace ' + @CurrentNamespace + '
{

	public class ' + @BOName + '
	{
		#region protected members

'

DECLARE  @pkprefix varchar(10)

DECLARE cur CURSOR FOR
SELECT colname, coldefault, isnullable, 
CASE datatype
WHEN 'int' THEN 'int'
WHEN 'bit'  THEN 'bool'
WHEN 'tinyint' THEN 'byte'
WHEN 'datetime' THEN 'DateTime'
WHEN 'decimal' THEN 'decimal'
WHEN 'float' THEN 'double'
WHEN 'smallint' THEN 'short'
WHEN 'bigint' THEN 'long'
ELSE 'string'
END,
collen,
CASE datatype
WHEN 'int' THEN 'n'
WHEN 'bit'  THEN 'b'
WHEN 'tinyint' THEN 'bt'
WHEN 'datetime' THEN 'dt'
WHEN 'decimal' THEN 'dc'
WHEN 'float' THEN 'db'
WHEN 'smallint' THEN 'n'
WHEN 'bigint' THEN 'n'
ELSE 'str'
END
 FROM @columns
DECLARE @notfirst bit


-- protected fields
OPEN cur
SET @notfirst = 0
WHILE 1 = 1
BEGIN
	FETCH NEXT FROM cur INTO @colname, @coldefault, @isnullable, @datatype, @collen, @prefix
	IF @@FETCH_STATUS <> 0 BREAK
	IF @colname = @pk
	BEGIN
		SELECT @pkdatatype = @datatype, @pkprefix = @prefix
	END
	SET @sql = @sql + '		protected ' + @datatype + ' m_' + @prefix + @colname + ';
'  
END
CLOSE cur
SET @sql = @sql + '
		#endregion

		#region constructors

		public ' + @BOName + '()
		{}
'

print @sql

SET @sql = '
		#endregion

		#region public properties

'

OPEN cur
SET @notfirst = 0
WHILE 1 = 1
BEGIN
	FETCH NEXT FROM cur INTO @colname, @coldefault, @isnullable, @datatype, @collen, @prefix
	IF @@FETCH_STATUS <> 0 BREAK
	SET @sql = @sql + '		public ' + @datatype + ' ' + CASE WHEN @colname = @pk THEN @IDPropertyName ELSE @colname END + '
		{
			get { return m_' + @prefix + @colname + '; }
			set { m_' + @prefix + @colname + ' = value; }
		}
'  
END
CLOSE cur

SET @sql = @sql + '
	}
'
print @sql

SET @sql = '	public class ' + @BOCollectionName + ' : CollectionBase, IEnumerator
	{
		protected Hashtable m_Hash;

		public ' + @BOCollectionName + '()
		{
			m_Hash = new Hashtable();
		}

		public void Add(' + @BOName + ' item)
		{
			m_Hash.Add(item.' + @IDPropertyName + ', item);
			List.Add(item);
		}

		public ' + @BOName + ' this[int nIndex]
		{
			get
			{
				return (' + @BOName + ')List[nIndex];
			}
		}

		public new void RemoveAt(int nIndex)
		{
			m_Hash.Remove(((' + @BOName + ')List[nIndex]).' + @IDPropertyName + ');
			List.RemoveAt(nIndex);
		}

		public ' + @BOName + ' GetBy' + @IDPropertyName + '(' + ISNULL(@pkdatatype, 'int') + ' ' + ISNULL(@pkprefix, 'n') + @IDPropertyName + ')
		{
			return (' + @BOName + ')m_Hash[' + ISNULL(@pkprefix, 'n') + @IDPropertyName + '];
		}

		protected int m_nIndex;
		public void Reset()
		{
			m_nIndex = -1;
		}

		public ' + @BOName + ' Current
		{
			get
			{
				return ((' + @BOName + ')this[m_nIndex]);
			}
		}

		object IEnumerator.Current
		{
			get
			{
				return(Current);
			}
		}

		public bool MoveNext()
		{
			m_nIndex++;
			return(m_nIndex < Count);
		}
	}
}'

print @sql

DEALLOCATE cur