public SqlObjectAccessCommand(SqlDataStore dataStore, Type dynamicType, string cmdText, bool polymorphic, CommandType commandType) { this.dataStore = dataStore; this.cmdText = cmdText; this.polymorphic = polymorphic; this.dynamicType = dynamicType; this.commandType = commandType; if(commandType == CommandType.Text){ command = new SqlDataAccessCommand(dataStore, dataStore.DataStorageManager.CreateQuery(dynamicType, cmdText, polymorphic), commandType); } else { command = new SqlDataAccessCommand(dataStore, cmdText, commandType); } }
public object Clone() { SqlObjectAccessCommand cmd = (SqlObjectAccessCommand)this.MemberwiseClone(); this.command = (SqlDataAccessCommand)command.Clone(); return cmd; }
/// <summary> /// Executes the Data Access Command. /// </summary> /// <returns></returns> public IList Execute(int pageIndex, int pageSize, out int totalCount) { // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto05.asp Debug.WriteLine("Original SQL: " + Command.command.command.CommandText); string sql = Command.command.command.CommandText; string orderby = ExtractOrderBy(sql); if (orderby == null) { throw new ApplicationException("A order by clause is required for paging."); } string countSql = "SELECT COUNT(*) " + ExtractFrom(sql); Trace.Write("Check Count"); SqlDataAccessCommand cmd = new SqlDataAccessCommand(this.Command.dataStore, countSql); totalCount = (int)cmd.ExecuteScalar(); sql = "SELECT * FROM ( SELECT TOP " + Math.Min(pageSize, Math.Max(0,totalCount - pageSize * pageIndex)) + " * FROM ( SELECT TOP " + pageSize * (pageIndex + 1) + " " + ExtractQuery(sql) + " ) AS Top1 ORDER BY " + ReverseOrderBy(orderby) + " ) AS Top2 ORDER BY " + orderby; Command.command.command.CommandText = sql; Trace.Write("Execute Search"); return Execute(); }
internal override void Update(object o, TypeMapping typeMapping) { if(typeMapping.BaseType != null){ TypeMapping baseTypeMapping = null; if((baseTypeMapping = DataStorageManager.GetTypeMapping(typeMapping.BaseType)) == null){ throw new DataStoreException("DataStore does not contain storage for " + typeMapping.BaseType.FullName); } Update(o,baseTypeMapping); } if ((typeMapping.PrimaryKey != null && typeMapping.MemberMappings.Count > 1) || (typeMapping.PrimaryKey == null && typeMapping.MemberMappings.Count > 0)) { SqlDataAccessCommand updateCommand; if (typeMapping.UseStoredProcedures) { updateCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GetUpdateProcedureName(typeMapping), CommandType.StoredProcedure); } else { updateCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GenerateUpdateSql(typeMapping), CommandType.Text); } foreach (IMemberMapping mapping in typeMapping.MemberMappings) { SqlMemberDbType dbType = (SqlMemberDbType)mapping.MemberDbType; if (dbType.Length == 0) { updateCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, mapping.GetValue(o)); } else { updateCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, dbType.Length, mapping.GetValue(o)); } } updateCommand.ExecuteNonQuery(); } }
internal override void Insert(object o, TypeMapping typeMapping) { if(typeMapping.BaseType != null){ TypeMapping baseTypeMapping = null; if((baseTypeMapping = DataStorageManager.GetTypeMapping(typeMapping.BaseType)) == null){ throw new DataStoreException("DataStore does not contain storage for " + typeMapping.BaseType.FullName); } Insert(o,baseTypeMapping); } SqlDataAccessCommand insertCommand; if(typeMapping.UseStoredProcedures){ insertCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GetInsertProcedureName(typeMapping), CommandType.StoredProcedure); } else { insertCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GenerateInsertSql(typeMapping), CommandType.Text); } IDbDataParameter output = null; IMemberMapping outputmapping = null; foreach(IMemberMapping mapping in typeMapping.MemberMappings){ SqlMemberDbType dbType = (SqlMemberDbType)mapping.MemberDbType; if(mapping.PrimaryKey && mapping.Identity){ output = insertCommand.CreateOutputParameter("@" + mapping.ColumnName, dbType.SqlDbType); outputmapping = mapping; } else if(dbType.Length == 0){ insertCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, mapping.GetValue(o)); } else { insertCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, dbType.Length, mapping.GetValue(o)); } } insertCommand.ExecuteNonQuery(); if(output!=null){ outputmapping.SetValue(o,output.Value); } }
public void Delete(TypeMapping typeMapping, object primaryKey, bool cascade) { foreach(Type subClass in typeMapping.SubClasses){ Delete(this.DataStorageManager.GetTypeMapping(subClass), primaryKey, false); } SqlDataAccessCommand deleteCommand; if(typeMapping.UseStoredProcedures){ deleteCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GetDeleteProcedureName(typeMapping), CommandType.StoredProcedure); } else { deleteCommand = new SqlDataAccessCommand(this, ((SqlDataStorageManager)this.DataStorageManager).GenerateDeleteSql(typeMapping), CommandType.Text); } IMemberMapping mapping = typeMapping.PrimaryKey; SqlMemberDbType dbType = (SqlMemberDbType)mapping.MemberDbType; if(dbType.Length == 0){ deleteCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, primaryKey); } else { deleteCommand.CreateInputParameter("@" + mapping.ColumnName, dbType.SqlDbType, dbType.Length, primaryKey); } deleteCommand.ExecuteNonQuery(); if(cascade){ if(typeMapping.BaseType != null){ TypeMapping baseTypeMapping = null; if((baseTypeMapping = DataStorageManager.GetTypeMapping(typeMapping.BaseType)) == null){ throw new DataStoreException("DataStore does not contain storage for " + typeMapping.BaseType.FullName); } Delete(baseTypeMapping, primaryKey, true); } } }