760 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			760 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ##|TYPE Template
 | |
| ##|UNIQUEID d6b504d5-d9c6-42fe-8819-07780ea72506
 | |
| ##|TITLE CSLA Stored Procedures - Volian
 | |
| ##|NAMESPACE CSLA_21
 | |
| ##|SOURCE_TYPE Source
 | |
| ##|OUTPUT_LANGUAGE Transact-SQL
 | |
| ##|GUI_ENGINE .Net Script
 | |
| ##|GUI_LANGUAGE C#
 | |
| ##|GUI_BEGIN
 | |
| 
 | |
| public class GeneratedGui : DotNetScriptGui
 | |
| {
 | |
| 	public GeneratedGui(ZeusContext context) : base(context) {}
 | |
| 
 | |
| 	//-----------------------------------------
 | |
| 	// The User Interface Entry Point
 | |
| 	//-----------------------------------------
 | |
| 	public override void Setup()
 | |
| 	{
 | |
| 		if ( !input.Contains( "chooseTables" ) || !input.Contains( "txtPath" ) ||
 | |
| 				( !input.Contains( "chkClass" ) && !input.Contains( "chkNaming" ) ) )
 | |
| 		{
 | |
| 			if(context.Objects.ContainsKey("DnpUtils"))DnpUtils.ReadInputFromCache(context);
 | |
| 			ui.Title = "CSLA Object Mapping";
 | |
| 			ui.Width = 600;
 | |
| 			ui.Height = 660;
 | |
| 			GuiLabel label1 = ui.AddLabel( "label1", "Select the output path:", "Select the output path in the field below." );
 | |
| 			//label1.Width = 200;
 | |
| 			GuiTextBox outputPath = ui.AddTextBox( "outputPath", GetDefault("defaultOutputPath"), "Select the Output Path." );
 | |
| 			outputPath.Width = 450;
 | |
| 			GuiFilePicker selectPath = ui.AddFilePicker( "selectPath", "Select Path", "Select the Output Path.", "outputPath", true );
 | |
| 			selectPath.Top = outputPath.Top;
 | |
| 			selectPath.Width = 100;
 | |
| 			selectPath.Left = outputPath.Left + outputPath.Width + 20;
 | |
| 			
 | |
| 			GuiLabel label2 = ui.AddLabel( "label2", "Namespace: ",  "Provide your objects namespace." );
 | |
| 			label2.Width = 280;
 | |
| 			GuiTextBox classNamespace = ui.AddTextBox( "classNamespace", "Volian.Object.Library", "Provide your objects namespace." );				
 | |
| 			classNamespace.Width = 280;
 | |
| 			
 | |
|             GuiLabel label3 = ui.AddLabel( "label3", "Member prefix: ", "Provide your member prefix." );
 | |
| 			label3.Width = 100;
 | |
| 			label3.Top = label2.Top;
 | |
| 			label3.Left = label2.Width + 20;
 | |
| 			GuiTextBox memberPrefix = ui.AddTextBox( "memberPrefix", "_", "Provide your member prefix." );
 | |
| 			memberPrefix.Width = 100;
 | |
| 			memberPrefix.Top = classNamespace.Top;
 | |
| 			memberPrefix.Left = classNamespace.Width + 20;
 | |
|            
 | |
| 			GuiLabel label3A = ui.AddLabel( "label3A", "dbConnection: ", "Provide a Connection Name." );
 | |
| 			label3A.Width = 150;
 | |
| 			label3A.Top = label3.Top;
 | |
| 			label3A.Left = label3.Left+label3.Width + 10;
 | |
| 			GuiTextBox dbConnection = ui.AddTextBox( "dbConnection", "VEPROMS", "Provide a Connection Name." );
 | |
| 			dbConnection.Width = 150;
 | |
| 			dbConnection.Top = memberPrefix.Top;
 | |
| 			dbConnection.Left = memberPrefix.Left + memberPrefix.Width + 10;
 | |
|              
 | |
| 			// Setup Database selection combobox.
 | |
| 			GuiLabel label4 = ui.AddLabel( "label4", "Select a database:", "Select a database in the dropdown below." );
 | |
| 			label4.Width = 280;
 | |
| 			GuiComboBox chooseDatabase = ui.AddComboBox( "chooseDatabase", "Select a database." );
 | |
| 			chooseDatabase.Width = 280;
 | |
| 			
 | |
| 			GuiCheckBox chkSelect = MakeGuiCheckBox( "chkSelect", "Select All", true, "Select All Records",100 );
 | |
| 			GuiCheckBox chkUpdate = MakeGuiCheckBox( "chkUpdate", "Update One", true, "Update One Record" ,150,chkSelect,150,0);
 | |
| 			GuiCheckBox chkFiles = MakeGuiCheckBox( "chkFiles", "Files", true, "Create Files" ,150,chkUpdate,200,0);
 | |
| 			GuiCheckBox chkInsert = MakeGuiCheckBox( "chkInsert", "Insert One", true, "Insert One Record" ,150,chkSelect,0,-1);
 | |
| 			GuiCheckBox chkDelete = MakeGuiCheckBox( "chkDelete", "Delete One", true, "Delete One Record" ,150,chkInsert,150,0);
 | |
| 			GuiCheckBox chkSelectPK = MakeGuiCheckBox( "chkSelectPK", "Select One", true, "Select One Record" ,150,chkInsert,0,-1);
 | |
| 			GuiCheckBox chkExists = MakeGuiCheckBox("chkExists","Exists",true,"Check Record Exists",150,chkSelectPK,150,0);
 | |
| 			GuiCheckBox chkPurge = MakeGuiCheckBox("chkPurge","Purge",true,"Purge All Data",150,chkSelectPK,0,-1);
 | |
| 			GuiCheckBox chkSelectFKs = MakeGuiCheckBox("chkSelectFKs","Select Group",true,"Select by Foreign Key",150,chkPurge,150,0);
 | |
| 
 | |
| 			// Setup Tables selection multi-select listbox.
 | |
| 			GuiLabel label7 = ui.AddLabel( "label7", "Select tables:", "Select tables from the listbox below." );
 | |
| 			//label7.Top = chkEqualsHashCode.Top + 20;
 | |
| 			GuiListBox chooseTables = ui.AddListBox( "chooseTables", "Select tables." );
 | |
| 			chooseTables.Height = 120;
 | |
| 	
 | |
| 			// Setup Views selection multi-select listbox.
 | |
| 			GuiLabel label8 = ui.AddLabel( "label8", "Select views:", "Select views from the listbox below." );
 | |
| 			GuiListBox chooseViews = ui.AddListBox( "chooseViews", "Select views." );
 | |
| 			chooseViews.Height = 120;
 | |
| 			
 | |
| 			// Attach the onchange event to the cmbDatabases control.
 | |
| 			setupDatabaseDropdown( chooseDatabase );
 | |
| 			chooseDatabase.AttachEvent( "onchange", "chooseDatabase_onchange" );
 | |
| 			
 | |
| 			ui.ShowGui = true;
 | |
| 		}
 | |
| 		else 
 | |
| 		{
 | |
| 			ui.ShowGui = false;
 | |
| 		}
 | |
| 	}
 | |
| 	public void setupDatabaseDropdown( GuiComboBox Databases )
 | |
| 	{
 | |
| 		try 
 | |
| 		{	
 | |
| 			if( MyMeta.IsConnected )
 | |
| 			{
 | |
| 				Databases.BindData( MyMeta.Databases );
 | |
| 				if( MyMeta.DefaultDatabase != null ) 
 | |
| 				{
 | |
| 					Databases.SelectedValue = MyMeta.DefaultDatabase.Alias;
 | |
| 					bindTables( Databases.SelectedValue );
 | |
| 					bindViews( Databases.SelectedValue );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		catch
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public void bindTables( string sDatabase )
 | |
| 	{
 | |
| 		//int count = 0;
 | |
| 	
 | |
| 		GuiListBox lstTables = ui["chooseTables"] as GuiListBox;
 | |
| 		
 | |
| 		try 
 | |
| 		{	
 | |
| 			IDatabase db = MyMeta.Databases[sDatabase];
 | |
| 			lstTables.BindData(db.Tables);
 | |
| 		}
 | |
| 		catch
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public void bindViews( string sDatabase )
 | |
| 	{
 | |
| 		//int count = 0;
 | |
| 	
 | |
| 		GuiListBox lstViews = ui["chooseViews"] as GuiListBox;
 | |
| 		
 | |
| 		try 
 | |
| 		{	
 | |
| 			IDatabase db = MyMeta.Databases[sDatabase];
 | |
| 			lstViews.BindData( db.Views );
 | |
| 		}
 | |
| 		catch
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public void chooseDatabase_onchange( GuiComboBox control )
 | |
| 	{
 | |
| 		//int count = 0;
 | |
| 
 | |
| 		GuiComboBox cmbDatabases = ui["chooseDatabase"] as GuiComboBox;
 | |
| 	
 | |
| 		bindTables( cmbDatabases.SelectedText );
 | |
| 		bindViews( cmbDatabases.SelectedText );
 | |
| 		GuiTextBox dbConnection = ui["dbConnection"] as GuiTextBox;
 | |
| 		dbConnection.Text=cmbDatabases.SelectedText;
 | |
| 		GuiTextBox classNamespace = ui["classNamespace"] as GuiTextBox;
 | |
| 		classNamespace.Text=cmbDatabases.SelectedText + ".Object.Library";
 | |
| 	}
 | |
| 	private string GetDefault(string sName)
 | |
| 	{
 | |
| 		if( input.Contains( sName ) ) 
 | |
| 		{
 | |
| 			return input[sName].ToString();
 | |
| 		}
 | |
| 		return "";
 | |
| 	}
 | |
| 	<%#FILE MakeGuiCheckBox.cs %>
 | |
| 
 | |
| }
 | |
| ##|GUI_END
 | |
| ##|BODY_MODE Markup
 | |
| ##|BODY_ENGINE .Net Script
 | |
| ##|BODY_LANGUAGE C#
 | |
| ##|BODY_TAG_START <%
 | |
| ##|BODY_TAG_END %>
 | |
| ##|BODY_BEGIN
 | |
| <%#NAMESPACE System.IO, System.Text, System.Text.RegularExpressions, System.Globalization %><%
 | |
| public class GeneratedTemplate : DotNetScriptTemplate
 | |
| {
 | |
| 	public GeneratedTemplate(ZeusContext context) : base(context) {}
 | |
| 	// Members
 | |
| 	private string _dbName;
 | |
| 	private ArrayList _selectedTables;
 | |
| 	private ArrayList _selectedViews;
 | |
| 	private string _exportPath;
 | |
| 	private string _nameSpace;
 | |
| 	private string _prefix;
 | |
| 	private string _dbConnection;
 | |
| 	private string _tableName;
 | |
| 	private string _className="";
 | |
| 	private ITable _workingTable;
 | |
| 	//private Hashtable dicRead;
 | |
| 	//private Hashtable dicReadI;
 | |
| 	public void SaveFile(string sProc)
 | |
| 	{
 | |
| 		if((bool)input["chkFiles"]){
 | |
| 			output.save( Path.Combine( _exportPath, sProc + ".SQL" ), false );
 | |
| 			//output.writeln("--" + Path.Combine( _exportPath, "CSLA.SQL" ));
 | |
| 			output.clear();
 | |
| 		}
 | |
| 	}
 | |
| 	public delegate bool Filter(IColumn column);
 | |
| 	//---------------------------------------------------
 | |
| 	// Render() is where you want to write your logic    
 | |
| 	//---------------------------------------------------
 | |
| 	public override void Render()
 | |
| 	{
 | |
| 		if(context.Objects.ContainsKey("DnpUtils"))DnpUtils.SaveInputToCache(context);
 | |
| 		InitializeMembers();
 | |
| 		if((bool)input["chkPurge"])SQLPurge();
 | |
| 		foreach(string sTable in _selectedTables)
 | |
| 		{
 | |
| 			ITable tbl = MyMeta.Databases[_dbName].Tables[sTable];
 | |
| 			_workingTable=tbl;
 | |
| 			if((bool)input["chkSelect"])SQLSelect(tbl);// Load all records
 | |
| 			if((bool)input["chkUpdate"])SQLUpdate(tbl);// Update single record based upon Primary Key
 | |
| 			if((bool)input["chkInsert"])SQLInsert(tbl);// Insert single record
 | |
| 			if((bool)input["chkDelete"])SQLDelete(tbl);// Delete single record based upon Primary Key
 | |
| 			if((bool)input["chkSelectPK"])SQLSelectPK(tbl);// Load one record by Primary Key
 | |
| 			if((bool)input["chkSelectPK"])SQLSelectUnique(tbl);// Load one record by Primary Key
 | |
| 			if((bool)input["chkSelectPK"])SQLSelectParent(tbl);// Load one record by Primary Key
 | |
| 			if((bool)input["chkExists"])SQLExists(tbl);// Check for existance by Primary Key
 | |
| 			if((bool)input["chkSelectFKs"])SQLSelectFKs(tbl);// Load all records by Foreign Keys
 | |
| 			//SQLIndexes(tbl);
 | |
| 		}
 | |
| 		_exportPath = input["outputPath"].ToString();
 | |
| 		//SaveFile();
 | |
| 	}
 | |
| 	private void SQLIndexes(ITable tbl)
 | |
| 	{
 | |
| 		foreach(IIndex ind in tbl.Indexes)
 | |
| 		{
 | |
| 			if(!ind.Name.StartsWith("PK_"))
 | |
| 			{
 | |
| 				output.writeln(ind.Name);
 | |
| 				foreach(IColumn col in ind.Columns)
 | |
| 				{
 | |
| 					output.writeln(" " + col.Name);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	private IColumn IntegerIdentity(ITable tbl)
 | |
| 	{
 | |
| 		if(tbl.PrimaryKeys.Count == 1){
 | |
| 			IColumn c = tbl.PrimaryKeys[0];
 | |
| 			if(c.IsAutoKey && c.DataTypeName != "Guid")return c;
 | |
| 		}
 | |
| 		return null;
 | |
| 	}
 | |
| 	private void SQLPurge()
 | |
| 	{
 | |
| 		StartProc("purgeData");
 | |
| 		%>
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| BEGIN TRY -- Try Block
 | |
| 	BEGIN TRANSACTION<%
 | |
| 		ArrayList toProcess = new ArrayList();
 | |
| 		ArrayList processed = new ArrayList();
 | |
| 		foreach(string sTable in _selectedTables)
 | |
| 		{
 | |
| 			toProcess.Add(MyMeta.Databases[_dbName].Tables[sTable]);
 | |
| 		}
 | |
| 		while(toProcess.Count > processed.Count)
 | |
| 		{
 | |
| 			int pCount = processed.Count;
 | |
| 			foreach(ITable tbl in toProcess)
 | |
| 			{
 | |
| 				if(!processed.Contains(tbl))
 | |
| 				{
 | |
| 					int count=0;
 | |
| 					IColumn colid = IntegerIdentity(tbl);
 | |
| 					string sSeed = (colid==null?"0":(colid.AutoKeySeed - colid.AutoKeyIncrement).ToString());
 | |
| //					output.writeln(string.Format("111 - {0} - {1},{2}",colid.Name,colid.AutoKeySeed,colid.AutoKeyIncrement));
 | |
| 					string sWhere = "";
 | |
| 					foreach(ForeignKey fk in tbl.ForeignKeys)
 | |
| 					{
 | |
| 						if(fk.PrimaryTable.Name == tbl.Name)
 | |
| 						{
 | |
| 							if(fk.ForeignTable.Name != tbl.Name)
 | |
| 							{
 | |
| 								if(toProcess.Contains(fk.ForeignTable) && !processed.Contains(fk.ForeignTable))
 | |
| 									count++;
 | |
| 							}
 | |
| 							else
 | |
| 							{
 | |
| 							//	sWhere = string.Format(" WHERE {0} <> {1}",colid.Name,colid.AutoKeySeed); 
 | |
| 							//	sSeed = (colid==null?"0":(colid.AutoKeySeed + colid.AutoKeyIncrement).ToString());
 | |
| //						//		output.writeln(string.Format("222 - {0} - {1},{2}",colid.Name,colid.AutoKeySeed,colid.AutoKeyIncrement));
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					if(count == 0)
 | |
| 					{
 | |
| %>
 | |
| 	delete from [<%=tbl.Name%>]<%=sWhere%><%
 | |
| 						// Need logic to only do this for identity columns
 | |
| 						if(colid != null)
 | |
| 						{
 | |
| %>
 | |
| 	dbcc checkident([<%=tbl.Name%>],reseed,<%=sSeed%>)<%
 | |
| 						}
 | |
| 						processed.Add(tbl);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			if(processed.Count ==pCount)return;
 | |
| 		}
 | |
| 		EndProcTran("purgeData");
 | |
| 	}
 | |
| 	private void InitializeMembers()
 | |
| 	{
 | |
| 		_dbName = input["chooseDatabase"].ToString();
 | |
| 		_selectedTables = input["chooseTables"] as ArrayList;
 | |
| 		_selectedViews = input["chooseViews"] as ArrayList;
 | |
| 		_exportPath = input["outputPath"].ToString();
 | |
| 		_nameSpace = input["classNamespace"].ToString();
 | |
| 		_prefix = input["memberPrefix"].ToString();
 | |
| 		_dbConnection = input["dbConnection"].ToString();
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// Select
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLSelect(ITable tbl)
 | |
| 	{
 | |
| 		string sproc = "get" + ClassesName(tbl); 	
 | |
| 		StartProc(sproc);
 | |
| %>
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT
 | |
| <%=FormatColumns("[{name}]",tbl.Columns,",\r\n","\t\t")%><%=FKCounts(tbl)%>
 | |
| 	FROM [<%=tbl.Name%>]<%
 | |
| 		EndProc(sproc);
 | |
| 	}
 | |
| 	private string FKCounts(ITable tbl)
 | |
| 	{
 | |
| 		string retval="";
 | |
| 		Hashtable dicAlias = new Hashtable();
 | |
| 		foreach(ForeignKey FK in tbl.ForeignKeys)
 | |
| 		{
 | |
| 			if(FK.PrimaryTable == tbl)
 | |
| 			{
 | |
| 				//string sAlias = GetAlias(dicAlias,FK.ForeignTable);
 | |
| 				string sAlias = GetAlias(FK);
 | |
| 				string sep="";
 | |
| 				string sAliasFK = FK.ForeignTable.Name;
 | |
| 				string sAliasFK2 = "";
 | |
| 				if(FK.PrimaryTable == FK.ForeignTable)
 | |
| 				{
 | |
| 					sAliasFK=ChildrenName(FK);
 | |
| 					sAliasFK2=" [" + sAliasFK + "]";
 | |
| 				}
 | |
| 				retval += ",\r\n\t\t(SELECT COUNT(*) FROM [" + FK.ForeignTable.Name + "]" + sAliasFK2 + " WHERE ";
 | |
| 				for(int i=0;i<FK.PrimaryColumns.Count;i++)
 | |
| 				{
 | |
| 					retval += sep + "[" + sAliasFK + "].[" + FK.ForeignColumns[i].Name + "]=[" +
 | |
| 						FK.PrimaryTable.Name + "].[" + FK.PrimaryColumns[i].Name + "]";
 | |
| 					sep = " AND ";
 | |
| 				}
 | |
| 				//retval += ") [" + ClassName(FK.ForeignTable)+ sAlias + "Count]";
 | |
| 				retval += ") [" + FKCountName(tbl,FK,sAlias) + "Count]";
 | |
| 			}
 | |
| 		}
 | |
| 		return retval;
 | |
| 	}
 | |
| 	
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// Update
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLUpdate(ITable tbl)
 | |
| 	{
 | |
| 		if(tbl.PrimaryKeys.Count == tbl.Columns.Count)
 | |
| 		{
 | |
| 			// No Columns other than Primary Key Columns - Nothing to Update
 | |
| 			// Instead of Update - Do a Delete followed by an Insert
 | |
| %>
 | |
| 	-- Update cannot be performed on <%=tbl.Name%> since it doesn't contain
 | |
| 	-- any columns that are not part of the Primary Key
 | |
| <%
 | |
| 			return;
 | |
| 		}
 | |
| 		string sproc = "update" + ClassName(tbl); 	
 | |
| 		StartProc(sproc);
 | |
| 		%>
 | |
| (
 | |
| <%=FormatColumns("{@} {dtype}{?null}",tbl.Columns,",\r\n","\t")%><%=FormatColumns("{@new} {dtype} output",Computed(tbl),"",",\r\n\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| BEGIN TRY -- Try Block
 | |
| 	BEGIN TRANSACTION
 | |
| 	UPDATE [<%=tbl.Name%>]
 | |
| 		SET
 | |
| <%=FormatColumns("[{name}]={@}",Updatable(tbl),",\r\n","\t\t\t")%>
 | |
| 		WHERE <%=FormatColumns("[{name}]={@}",NotUpdatable(tbl)," AND ","")%>
 | |
| 	IF @@ROWCOUNT = 0
 | |
| 	BEGIN
 | |
| 		IF NOT exists(select * from [<%=tbl.Name%>] WHERE <%=FormatColumns("[{name}]={@}",PrimaryKey(tbl)," AND ","")%>)
 | |
| 			RAISERROR('<%=ClassName(tbl)%> record has been deleted by another user', 16, 1)
 | |
| 		ELSE           	
 | |
| 			RAISERROR('<%=ClassName(tbl)%> has been edited by another user', 16, 1)            	
 | |
| 	END
 | |
| <%
 | |
| 		if(Computed(tbl).Count > 0){
 | |
| %>
 | |
| 		SELECT <%=FormatColumns("{@new}=[{name}]",Computed(tbl),",\r\n","\t\t")%>	
 | |
| 		FROM [<%=tbl.Name%>] WHERE <%=FormatColumns("[{name}]={@}",tbl.PrimaryKeys," AND ","")%>		
 | |
| <%
 | |
| 		}
 | |
| 		EndProcTran(sproc);
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// Insert
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLInsert(ITable tbl)
 | |
| 	{
 | |
| 		string sproc = "add" + ClassName(tbl);
 | |
| 		StartProc(sproc);
 | |
| %>
 | |
| (
 | |
| <%=FormatColumns("{@} {dtype}{?null}",Insertable(tbl),",\r\n","\t")%><%=FormatColumns("{@new} {dtype} output",NotInsertable(tbl),"",",\r\n\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| BEGIN TRY -- Try Block
 | |
| 	BEGIN TRANSACTION
 | |
| 	INSERT INTO [<%=tbl.Name%>]
 | |
| 	(
 | |
| <%=FormatColumns("[{name}]",Insertable(tbl),",\r\n","\t\t")%>
 | |
| 	)
 | |
| 	VALUES
 | |
| 	(
 | |
| <%=FormatColumns("{@}",Insertable(tbl),",\r\n","\t\t")%>
 | |
| 	)
 | |
| <%=FormatColumns("SELECT {@new}= SCOPE_IDENTITY()",AutoKey(tbl),"\r\n","\t")%><%
 | |
| 		// Update Output Values
 | |
| 		ArrayList cmp = Computed(tbl);
 | |
| 		if(cmp.Count > 0){
 | |
| %>
 | |
| 	SELECT <%=FormatColumns("{@new}=[{name}]",cmp,"\r\n","\t\t")%>
 | |
| 		FROM [<%=tbl.Name%>] WHERE <%=FormatColumns("[{name}]={@key}",tbl.PrimaryKeys," AND ","")%><%
 | |
| 		}
 | |
| 		EndProcTran(sproc);
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// Delete
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLDelete(ITable tbl)
 | |
| 	{
 | |
| 		string sproc = "delete" + ClassName(tbl);	
 | |
| 		StartProc(sproc);
 | |
| %>
 | |
| (
 | |
| <%=FormatColumns("{@} {dtype}",tbl.PrimaryKeys,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| BEGIN TRY -- Try Block
 | |
| 	BEGIN TRANSACTION<%
 | |
| 	foreach(IForeignKey fk in tbl.ForeignKeys)
 | |
| 	{
 | |
| 		if(tbl != fk.ForeignTable)
 | |
| 		{
 | |
| %>
 | |
| 	DELETE [<%=fk.ForeignTable.Name%>]
 | |
| 		WHERE<%
 | |
| 			string sep = " ";
 | |
| 			for(int j=0;j<fk.ForeignColumns.Count;j++)
 | |
| 			{
 | |
| 				output.write(sep + "[" + fk.ForeignColumns[j].Name + "]=" + ParameterName(fk.PrimaryColumns[j]));
 | |
| 				sep = ", ";
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| %>
 | |
| 	DELETE [<%=tbl.Name%>]
 | |
| 		WHERE <%=FormatColumns("[{name}] = {@}",tbl.PrimaryKeys," AND ","")%><%
 | |
| 		EndProcTran(sproc);
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// SelectPK
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLSelectPK(ITable tbl)
 | |
| 	{
 | |
| 		string sproc = "get" + ClassName(tbl); 	
 | |
| 		StartProc(sproc);
 | |
| 		%>
 | |
| (
 | |
| <%=FormatColumns("{@} {dtype}",tbl.PrimaryKeys,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT
 | |
| <%=FormatColumns("[{name}]",tbl.Columns,",\r\n","\t\t")%><%=FKCounts(tbl)%>
 | |
| 	FROM [<%=tbl.Name%>]
 | |
| 	WHERE <%=FormatColumns("[{name}]={@}",tbl.PrimaryKeys," AND ","")%><%
 | |
| 		// Need to loop through foreign keys and select related records
 | |
| 		FKSelects(tbl);
 | |
| 		EndProc(sproc);
 | |
| 	}
 | |
| 	private bool IsPrimaryKey(IIndex ind)
 | |
| 	{
 | |
| 		IColumns colsi = ind.Columns;
 | |
| 		IColumns colsp = ind.Table.PrimaryKeys;
 | |
| 		if(colsi.Count != colsp.Count)return false;
 | |
| 		for(int i=0;i<colsi.Count;i++)
 | |
| 		{
 | |
| 			if(colsi[i]!=colsp[i])
 | |
| 				return false;
 | |
| 		}
 | |
| 		return true;
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// SelectUnique
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLSelectUnique(ITable tbl)
 | |
| 	{
 | |
| 		foreach(IIndex ind in tbl.Indexes)
 | |
| 		{
 | |
| 			if(!IsPrimaryKey(ind) && ind.Unique)
 | |
| 			{
 | |
| 				string sproc = "get" + ClassName(tbl) + "By" + FormatColumns("{name}",ind.Columns,"_",""); 	
 | |
| 				StartProc(sproc);
 | |
| 				%>(
 | |
| <%=FormatColumns("{@} {dtype}",ind.Columns,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT
 | |
| <%=FormatColumns("[{name}]",tbl.Columns,",\r\n","\t\t")%><%=FKCounts(tbl)%>
 | |
| 	FROM [<%=tbl.Name%>]
 | |
| 	WHERE <%=FormatColumns("[{name}]={@}",ind.Columns," AND ","")%><%
 | |
| 		// Need to loop through foreign keys and select related records
 | |
| 				EndProc(sproc);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// SelectParent
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLSelectParent(ITable tbl)
 | |
| 	{
 | |
| 		if(!FKParent(tbl))return;
 | |
| 		IForeignKey fk = FKParentFK(tbl);
 | |
| 		string sproc = "get" + ParentName(fk) + ClassName(tbl); 	
 | |
| 		StartProc(sproc);
 | |
| 		%>(
 | |
| <%=FormatColumns("{@} {dtype}",fk.ForeignColumns,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT
 | |
| <%=FormatColumns("[{name}]",tbl.Columns,",\r\n","\t\t")%><%=FKCounts(tbl)%>
 | |
| 	FROM [<%=tbl.Name%>]
 | |
| 	WHERE<%
 | |
| 		string sep="";
 | |
| 		for(int i = 0; i<fk.ForeignColumns.Count; i++)
 | |
| 		{
 | |
| 		%>
 | |
| 		<%=FormatColumn("[{name}]=",fk.PrimaryColumns[i])%><%=FormatColumn("{@}",fk.ForeignColumns[i])%><%=sep%><%
 | |
| 			sep=" AND";
 | |
| 		}
 | |
| 		EndProc(sproc);
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// Exists
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLExists(ITable tbl)
 | |
| 	{
 | |
| 		string sproc = "exists" + ClassName(tbl); 	
 | |
| 		StartProc(sproc);
 | |
| 		%>
 | |
| (
 | |
| <%=FormatColumns("{@} {dtype}",tbl.PrimaryKeys,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT COUNT(*)
 | |
| 	FROM [<%=tbl.Name%>] WHERE <%=FormatColumns("[{name}]={@}",tbl.PrimaryKeys," AND ","")%><%
 | |
| 		EndProc(sproc);
 | |
| 	}
 | |
| 	//----------------------------------------------------------------------
 | |
| 	// SelectFKs
 | |
| 	//----------------------------------------------------------------------
 | |
| 	private void SQLSelectFKs(ITable tbl)
 | |
| 	{
 | |
| 		Hashtable dicAlias = new Hashtable();
 | |
| 		foreach(IForeignKey FK in tbl.ForeignKeys)
 | |
| 		{
 | |
| 			if(tbl == FK.ForeignTable)
 | |
| 			{
 | |
| 				//string sAlias = GetAlias(dicAlias,FK.PrimaryTable);
 | |
| 				string sAlias = GetAlias(FK);
 | |
| 				SQLSelectFK(tbl,FK,sAlias);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	private void SQLSelectFKChild(ITable tbl, IForeignKey FK,string sAlias)
 | |
| 	{
 | |
| 		string sproc = "get" + FKSelectName(tbl,FK,sAlias);	
 | |
| 		StartProc(sproc);
 | |
| %>
 | |
| (
 | |
| <%=FormatColumns2("{@} {dtype}",FK,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS
 | |
| 	SELECT
 | |
| <%=FormatColumns("[{name}]",tbl.Columns,",\r\n","\t\t")%><%=FKCounts(tbl)%>
 | |
| 	FROM [<%=tbl.Name%>] WHERE <%=FormatColumns2("[{fkname}]={@}",FK," AND ","")%> AND <%=FormatColumns2("[{!column}]<>{@}",FK," AND ","")%><%
 | |
| 		EndProc(sproc);
 | |
| 	}
 | |
| 	private void SQLSelectFK(ITable tbl, IForeignKey FK,string sAlias)
 | |
| 	{
 | |
| 		if(FK.PrimaryTable == FK.ForeignTable){
 | |
| 			SQLSelectFKChild(tbl,FK,sAlias);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			//string sproc = "get" + FKSelectName(tbl,FK,sAlias);	
 | |
| 			string sproc = "get" + FKSelectName(tbl,FK,"");	
 | |
| 			StartProc(sproc);
 | |
| %>
 | |
| (
 | |
| <%=FormatColumns2("{@} {dtype}",FK,",\r\n","\t")%>
 | |
| )
 | |
| WITH EXECUTE AS OWNER
 | |
| AS<%
 | |
| 			string sWhere = "\r\n\tWHERE\r\n\t\t" + FormatColumns2("[{fktable}].[{fkname}]={@}",FK," AND ","");
 | |
| 			FKSelect(FK,(FK.PrimaryTable==tbl?FK.ForeignTable:FK.PrimaryTable),FKCounts(tbl),sWhere);
 | |
| 			EndProc(sproc);
 | |
| 		}
 | |
| 	}
 | |
| 	private void StartProc(string sproc)
 | |
| 	{
 | |
| 		// Drop and recreate
 | |
| %>
 | |
| /****** Object:  StoredProcedure [<%=sproc%>] ******/
 | |
| IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[<%=sproc%>]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
 | |
|     DROP PROCEDURE [<%=sproc%>];
 | |
| GO
 | |
| 	
 | |
| CREATE PROCEDURE [dbo].[<%=sproc%>]
 | |
| <%
 | |
| 	}
 | |
| 	private void EndProc(string sproc)
 | |
| 	{
 | |
| %>
 | |
| 	RETURN
 | |
| GO
 | |
| -- Display the status of Proc creation
 | |
| IF (@@Error = 0) PRINT 'Procedure Creation: <%=sproc%> Succeeded'
 | |
| ELSE PRINT 'Procedure Creation: <%=sproc%> Error on Creation'
 | |
| GO
 | |
| <%
 | |
| 	SaveFile(sproc);
 | |
| 	}
 | |
| 	private void EndProcTran(string sproc)
 | |
| 	{
 | |
| %>
 | |
| 	IF( @@TRANCOUNT > 0 ) COMMIT
 | |
| END TRY
 | |
| BEGIN CATCH -- Catch Block
 | |
| 	IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level
 | |
|  	ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit.  Top level will rollback
 | |
| 	EXEC vlnErrorHandler
 | |
| END CATCH
 | |
| GO
 | |
| -- Display the status of Proc creation
 | |
| IF (@@Error = 0) PRINT 'Procedure Creation: <%=sproc%> Succeeded'
 | |
| ELSE PRINT 'Procedure Creation: <%=sproc%> Error on Creation'
 | |
| GO
 | |
| <%
 | |
| 	SaveFile(sproc);
 | |
| 	}
 | |
| 	private void FKSelects(ITable tbl)
 | |
| 	{
 | |
| 		foreach(ForeignKey fk in tbl.ForeignKeys)
 | |
| 		{
 | |
| //			WriteLine("\r\n--ForeignKey - {0} - {1}\r\n",fk.Name,IsPrimaryKey(fk));
 | |
| 			if(tbl != fk.ForeignTable)
 | |
| 				//if(!IsPrimaryKey(fk)) - This was removed so that one to one relationships would return records.
 | |
| 					FKSelect(fk,tbl,"",BuildWhere(fk));
 | |
| 		}
 | |
| 	}
 | |
| 	private void FKSelect(IForeignKey fk, ITable tbl, string sCounts,string sWhere)
 | |
| 	{
 | |
| 		string sjoin="";
 | |
| 		string ssep="";
 | |
| 		Hashtable dicAlias = new Hashtable();
 | |
| %>
 | |
| 
 | |
| 	SELECT
 | |
| <%=FormatFKColumns("[{tbl}].[{name}]",fk,",\r\n","\t\t",ref ssep)%><%
 | |
| 		foreach(ForeignKey pk in fk.ForeignTable.ForeignKeys)
 | |
| 		{
 | |
| //			if(ManyToMany(tbl,fk,pk))
 | |
| 			if(tbl != pk.PrimaryTable && fk.ForeignTable == pk.ForeignTable && pk.PrimaryTable != pk.ForeignTable && ForeignRequired(pk))
 | |
| 			{
 | |
| 				//string sAlias=GetAlias(dicAlias,pk.PrimaryTable);
 | |
| 				string sAlias=GetAlias(pk);
 | |
| 				string sJoinAdd = BuildJoin(pk,sAlias);
 | |
| 				if(sJoinAdd != null) // Only add related tables that are associated with a required field
 | |
| 				{
 | |
| 					sjoin += sJoinAdd;
 | |
| %><%=FormatPKColumns("[{tbl}].[{name}] [{fname}]",pk,",\r\n","\t\t",ref ssep,sAlias)%><%
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| %><%=sCounts%>
 | |
| 	FROM [<%=fk.ForeignTable.Name%>]<%=sjoin%><%=sWhere%>
 | |
| <%
 | |
| 	}
 | |
| /*
 | |
| 	private string DefineAlias(IForeignKey pk,Hashtable dicAlias)
 | |
| 	{
 | |
| 		if(((int)dicAlias[pk.PrimaryTable.Name])==0)return "";
 | |
| 		return "[" + pk.PrimaryTable.Name + "_" + dicAlias[pk.PrimaryTable.Name].ToString() + "]";
 | |
| 	}
 | |
| 	private string UseAlias(string tblname,Hashtable dicAlias)
 | |
| 	{
 | |
| 		if(((int)dicAlias[tblname])==0)return tblname;
 | |
| 		return tblname + "_" + dicAlias[tblname].ToString();
 | |
| 		
 | |
| 	}
 | |
| */
 | |
| 	private string BuildJoin(IForeignKey pk,string sAlias)
 | |
| 	{
 | |
| 		string sjoin="\r\n\t\tJOIN [" + pk.PrimaryTable.Name + "] " + (sAlias==""?"":"[" + pk.PrimaryTable.Name + sAlias + "]") + " ON";
 | |
| 		for(int j=0;j<pk.PrimaryColumns.Count;j++)
 | |
| 		{
 | |
| 			sjoin += "\r\n\t\t\t[" + pk.PrimaryTable.Name + sAlias + "].[" + pk.PrimaryColumns[j].Name + "]="
 | |
| 				+ "[" + pk.ForeignTable.Name + "].[" + pk.ForeignColumns[j].Name + "]";
 | |
| 		}
 | |
| 		return sjoin;
 | |
| 	}
 | |
| 	private string BuildWhere(IForeignKey fk)
 | |
| 	{
 | |
| 		string swhere="\r\n\tWHERE";
 | |
| 		for(int j=0;j<fk.PrimaryColumns.Count;j++)
 | |
| 		{
 | |
| 			swhere += "\r\n\t\t[" + fk.ForeignTable.Name + "].[" + fk.ForeignColumns[j].Name 
 | |
| 				+ "]=" + ParameterName(fk.PrimaryColumns[j]);
 | |
| 		}
 | |
| 		return swhere;
 | |
| 	}
 | |
| %><%#FILE NamingConvention.cs%><%
 | |
| %><%#FILE ForeignKeyProcessing.cs%><%
 | |
| %><%#FILE FilteredColumns.cs%><%
 | |
| %><%#FILE FormatColumns.cs%><%
 | |
| %><%#FILE WriteLine.cs%><%
 | |
| }
 | |
| %>
 | |
| ##|BODY_END
 | 
