using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;

using Microsoft.Practices.EnterpriseLibrary.Data;

using Befri.Query;
using Befri.Goldhoo.Models;

namespace Befri.Goldhoo.DataAccess
{
	/// <summary>
	/// <%= Table.Text %>数据存取类
	/// 生成日期: <%= DateTime.Today.ToLongDateString() %> <%= DateTime.Now.ToShortTimeString() %>
	///</summary>
	/// <remarks>
	/// 该文件是由代码生成器自动生成的, 请不要随意修改, 你的修改将在代码重新生成时会被覆盖,
	/// 如果要对该类进行修改, 请直接修改该分部类的<%= Table.AliasName %>DAO文件(文件名不含.designer)
	/// </remarks>
	public partial class <%= Table.AliasName %>DAO : BaseDAO
	{
		/// <summary>
		/// 返回满足查询条件的<%= Table.Text %>实体
		/// </summary>
		/// <param name="param">查询条件</param>
		/// <returns><%= Table.Text %>实体</returns>
		public <%= Table.AliasName %> Find<%= Table.AliasName%>(QueryParameter param)
		{
			string sql = @"<%= Request.Table.SqlBuilder.GetSelectCommandText() %>";
			
			if (param != null)
			{
				sql = QueryParameter.CompleteSqlString(sql, param);
			}

			DatabaseProviderFactory factory = new DatabaseProviderFactory();
			Database db = factory.CreateDefault();
			DbCommand command = db.GetSqlStringCommand(sql);

			if (param != null)
			{
				//设置参数
				foreach (IExpression exp in param.WhereExpressions)
				{
					if (exp is SimpleExpression)
					{
						SimpleExpression simple = exp as SimpleExpression;
						db.AddInParameter(command, simple.ExpName, simple.DbType, simple.Value);
					}
				}
			}
			
			<%= Table.AliasName %> <%= Table.aliasName %> = null;
			
			using (IDataReader dr = db.ExecuteReader(command))
			{
				if (dr.Read())
				{
					<%= Table.aliasName %> = new <%= Table.AliasName %>();
					<% foreach(ColumnSchema column in Table.Columns) {%>
					<%= GetFillValueString(column) %> <% } %>
				}
			}
			
			return <%= Table.aliasName %>;
		}
		
		/// <summary>
		/// 返回满足查询条件的<%= Table.Text %>实体列表
		/// </summary>
		/// <param name="param">查询条件</param>
		/// <returns><%= Table.Text %>实体列表</returns>
		public IList<<%= Table.AliasName %>> Get<%= Table.AliasName %>s(QueryParameter param)
		{
			string sql = @"<%= Request.Table.SqlBuilder.GetSelectCommandText() %>";

			if (param != null)
			{
				sql = QueryParameter.CompleteSqlString(sql, param);
			}

			DatabaseProviderFactory factory = new DatabaseProviderFactory();
			Database db = factory.CreateDefault();
			DbCommand command = db.GetSqlStringCommand(sql);

			if (param != null)
			{
				//设置参数
				foreach (IExpression exp in param.WhereExpressions)
				{
					if (exp is SimpleExpression)
					{
						SimpleExpression simple = exp as SimpleExpression;
						db.AddInParameter(command, simple.ExpName, simple.DbType, simple.Value);
					}
				}
			}
            
			IList<<%= Table.AliasName %>> list = new List<<%= Table.AliasName %>>();
                        
			using (IDataReader dr = db.ExecuteReader(command))
			{
				while (dr.Read())
				{
					<%= Table.AliasName %> <%= Table.aliasName %> = new <%= Table.AliasName %>();
					<% foreach(ColumnSchema column in Table.Columns) {%>
					<%= GetFillValueString(column) %> <% } %>
					
					list.Add(<%= Table.aliasName %>);
				}
			}   
                   
			return list; 
		}
                
		partial void OnInserting(<%= Table.AliasName %> <%= Table.aliasName %>);
		partial void OnInserted(<%= Table.AliasName %> <%= Table.aliasName %>, int affectedRecords);  
        
		/// <summary>
		/// 插入<%= Table.Text %>记录
		/// </summary>
		/// <param name="<%= Table.aliasName %>"><%= Table.Text %>对象</param>
		/// <returns></returns>
		public int Insert(<%= Table.AliasName %> <%= Table.aliasName %>)
		{
			OnInserting(<%= Table.aliasName %>);
			
			string sql = @"<%= Table.SqlBuilder.GetInsertCommandText(true) %>";
			
			DatabaseProviderFactory factory = new DatabaseProviderFactory();
			Database db = factory.CreateDefault();
			DbCommand command = db.GetSqlStringCommand(sql);
			<% foreach(ColumnSchema column in Table.Columns)
			{
				if (column.AutoIncrement == true)
				{ %>
			<%= GetIdentityOutParameterString(column) %> <%
			}
				else if (column.Inserted == true) { %>
			<%= GetInParameterString(column) %> <%
			   }
			} //end of foreach
			%>
			
			int affectedRecords = db.ExecuteNonQuery(command);
			
			OnInserted(<%= Table.aliasName %>, affectedRecords);
			
			if (affectedRecords < 1)
			{
				throw new ApplicationException("插入数据失败, 没有记录被插入");
			}
			<% if (Table.IdentityColumn != null)
				{  %>
			return (<%= Table.IdentityColumn.CSDataType %>)db.GetParameterValue(command, "<%= Table.IdentityColumn.AliasName %>");
			<%	}
				else { %>
			return affectedRecords; <% } %>
		}
		
		partial void OnUpdating(<%= Table.AliasName %> <%= Table.aliasName %>);
		partial void OnUpdated(<%= Table.AliasName %> <%= Table.aliasName %>, int affectedRecords);
       
		/// <summary>
		/// 更新<%= Table.Text %>记录
		/// </summary>
		/// <param name="<%= Table.aliasName %>"><%= Table.Text %>对象</param>
		/// <returns>受影响的记录数</returns>
		public int Update(<%= Table.AliasName %> <%= Table.aliasName %>)
		{
			OnUpdating(<%= Table.aliasName %>);
			
			string sql = @"<%= Request.Table.SqlBuilder.GetUpdateCommandText() %>";
			
			DatabaseProviderFactory factory = new DatabaseProviderFactory();
			Database db = factory.CreateDefault();
			DbCommand command = db.GetSqlStringCommand(sql);
			<% foreach(ColumnSchema column in Table.Columns)
			{
			if (column.Updated == true && column.ColumnName != "ModifiedOn" && column.ColumnName != "VersionNumber") {%>
			<%= GetInParameterString(column) %> <% 
				}
			} //end of foreach
			%>
			int affectedRecords = db.ExecuteNonQuery(command);
			
			OnUpdated(<%= Table.aliasName %>, affectedRecords);
			
			return affectedRecords;
		}
        
		/// <summary>
		/// 删除<%= Table.Text %>记录
		/// </summary>
		<% foreach(Arista.Data.ColumnSchema column in Table.Keys){%>/// <param name="<%= column.aliasName %>"><%= column.Text %></param><% } %>
		/// <returns>受影响的记录数</returns>
		public int Delete(<%= KeyParamsText %>)
		{
			string sql = @"<%= Request.Table.SqlBuilder.GetDeleteCommandText() %>";
			
			DatabaseProviderFactory factory = new DatabaseProviderFactory();
			Database db = factory.CreateDefault();
			DbCommand command = db.GetSqlStringCommand(sql);
			
			<% Response.Output.Indent = 3;
			foreach(ColumnSchema column in Table.Keys)
			{
				Response.Output.WriteLine("db.AddInParameter(command, \"{0}\", {1}, {2});", column.ColumnName, column.EnterpriseLibraryDataType, column.aliasName);
			}
			Response.Output.Indent = 0;
			%>
			return db.ExecuteNonQuery(command);
		}
    }
}