//public void Fill<T>(DataSet dataSet, Expression<Func<T, bool>> filterExpression) //{ // AdsEntityMapping mapping = AdsEntityMapping.GetForType(typeof(T)); // Fill<T>(mapping, dataSet, CreateQuery<T>(mapping, filterExpression)); //} public void Delete <T>(string sqlFilterExpression) where T : class { AdsEntityMapping mapping = AdsEntityMapping.GetForType(typeof(T)); AdsCommand command = new AdsCommand(); command.Connection = connection; command.CommandText = CreateDeleteQuery <T>(mapping, sqlFilterExpression); LastSqlCommandText = command.CommandText; command.ExecuteNonQuery(); }
public object GetAutoIncPrimaryKeyValue(object obj) { AdsEntityMapping mapping = AdsEntityMapping.GetForType(obj.GetType()); foreach (AdsEntityMemberMapping memberMapping in mapping.Members) { if (memberMapping.ColumnAttribute.IsPrimaryKey && memberMapping.ColumnAttribute.IsAutoGenerated) { return(memberMapping.GetValue(obj)); } } return(null); }
private string CreateDeleteQuery <T>(AdsEntityMapping mapping, string sqlFilterExpression) where T : class { List <string> parameters = new List <string>(); foreach (var member in mapping.Members) { parameters.Add(member.ResolvedName); } if (!string.IsNullOrEmpty(sqlFilterExpression)) { sqlFilterExpression = " where " + sqlFilterExpression; } else { sqlFilterExpression = string.Empty; } return(string.Format("delete from {0}", mapping.ResolvedName) + sqlFilterExpression); }
public static AdsEntityMapping GetForType(Type type) { if (cachedMappings.ContainsKey(type)) { return(cachedMappings[type]); } object[] attributes = type.GetCustomAttributes(typeof(AdsTableAttribute), true); if (attributes != null && attributes.Length > 0) { AdsEntityMapping mapping = new AdsEntityMapping(); mapping.EntityType = type; mapping.TableAttribute = (AdsTableAttribute)attributes[0]; foreach (MemberInfo memberInfo in type.GetMembers()) { object[] memberAttributes = memberInfo.GetCustomAttributes(typeof(AdsColumnAttribute), true); if (memberAttributes != null && memberAttributes.Length > 0) { AdsEntityMemberMapping memberMapping = new AdsEntityMemberMapping(memberInfo, (AdsColumnAttribute)memberAttributes[0]); mapping.Members.Add(memberMapping); } } cachedMappings.Add(type, mapping); return(mapping); } else { throw new AdsContextException("The class sent to SaveOrUpdate did not have the necessary AdsTable attribute", null); } }
private string CreateSelectQuery <T>(AdsEntityMapping mapping, int?topCount, string sqlFilterExpression, string sqlOrderExpression) where T : class { List <string> parameters = new List <string>(); foreach (var member in mapping.Members) { parameters.Add(member.ResolvedName); } string topExpression = string.Empty; if (topCount.HasValue) { topExpression = " top " + topCount.Value; } if (!string.IsNullOrEmpty(sqlFilterExpression)) { sqlFilterExpression = " where " + sqlFilterExpression; } else { sqlFilterExpression = string.Empty; } if (!string.IsNullOrEmpty(sqlOrderExpression)) { sqlOrderExpression = " order by " + sqlOrderExpression; } else { sqlOrderExpression = string.Empty; } return(string.Format("select{0} {1} from {2}", topExpression, string.Join(",", parameters.ToArray()), mapping.ResolvedName) + sqlFilterExpression + sqlOrderExpression); }
public void SaveOrUpdate(object obj) { AdsEntityMapping mapping = AdsEntityMapping.GetForType(obj.GetType()); AdsEntityMemberMapping autoIncPrimaryKeyMapping = null; bool isInsert = !mapping.IsPrimaryKeySet(obj); string list1 = string.Empty; string list2 = string.Empty; AdsCommand command = new AdsCommand(); command.Connection = connection; foreach (AdsEntityMemberMapping memberMapping in mapping.Members) { if (memberMapping.ColumnAttribute.IsPrimaryKey && memberMapping.ColumnAttribute.IsAutoGenerated) { autoIncPrimaryKeyMapping = memberMapping; } if (list1.Length > 0) { list1 += ","; } if (isInsert) { if (!memberMapping.ColumnAttribute.IsPrimaryKey) { list1 += memberMapping.ResolvedName; if (list2.Length > 0) { list2 += ","; } list2 += ":p_" + memberMapping.ResolvedName; } } else { if (memberMapping.ColumnAttribute.IsPrimaryKey) { if (list2.Length > 0) { list2 += " and "; } list2 += string.Format("{0} = :p_{0}", memberMapping.ResolvedName); } else { list1 += string.Format("{0} = :p_{0}", memberMapping.ResolvedName); } } if (!isInsert || (isInsert && !(memberMapping.ColumnAttribute.IsPrimaryKey && memberMapping.ColumnAttribute.IsAutoGenerated))) { command.Parameters.Add(":p_" + memberMapping.ResolvedName, memberMapping.GetValue(obj)); } } string sql; if (isInsert) { sql = string.Format("insert into {0} ({1}) values ({2})", mapping.ResolvedName, list1, list2); } else { sql = string.Format("update {0} set {1} where {2}", mapping.ResolvedName, list1, list2); } command.CommandText = sql; LastSqlCommandText = command.CommandText; command.ExecuteNonQuery(); if (isInsert && autoIncPrimaryKeyMapping != null) { object lastAutoInc; if (autoIncPrimaryKeyMapping.MemberType == typeof(int)) { lastAutoInc = command.LastAutoinc; } else if (autoIncPrimaryKeyMapping.MemberType == typeof(uint)) { lastAutoInc = (uint)command.LastAutoinc; } else if (autoIncPrimaryKeyMapping.MemberType == typeof(long)) { lastAutoInc = (long)command.LastAutoinc; } else if (autoIncPrimaryKeyMapping.MemberType == typeof(ulong)) { lastAutoInc = (ulong)command.LastAutoinc; } else { throw new NotImplementedException("The type of the primary key is not supported for auto-incrementation"); } autoIncPrimaryKeyMapping.SetValue(obj, lastAutoInc); } }
public void Fill <T>(DataSet dataSet, int?topCount, string sqlFilterExpression, string sqlOrderExpression) where T : class { AdsEntityMapping mapping = AdsEntityMapping.GetForType(typeof(T)); Fill <T>(mapping, dataSet, topCount, sqlFilterExpression, sqlOrderExpression); }
protected void Fill <T>(AdsEntityMapping mapping, DataSet dataSet, int?topCount, string sqlFilterExpression, string sqlOrderExpression) where T : class { DataTable table = new DataTable(mapping.ResolvedName); foreach (var member in mapping.Members) { DataColumn column = new DataColumn(member.ResolvedName); if (member.MemberType.IsGenericType) { Type genericTypeDef = member.MemberType.GetGenericTypeDefinition(); if (genericTypeDef == typeof(Nullable <>)) { column.AllowDBNull = true; column.DataType = member.MemberType.GetGenericArguments()[0]; } } else { if (member.MemberType.IsValueType) { column.AllowDBNull = false; } else { column.AllowDBNull = member.ColumnAttribute.IsNullable; } column.DataType = member.MemberType; } table.Columns.Add(column); } AdsCommand command = new AdsCommand(CreateSelectQuery <T>(mapping, topCount, sqlFilterExpression, sqlOrderExpression), connection); AdsDataAdapter adapter = new AdsDataAdapter(command); LastSqlCommandText = command.CommandText; adapter.Fill(table); if (IsAutoTrimmingEnabled) { foreach (var member in mapping.Members) { string name = member.ResolvedName; if (member.MemberType == typeof(string) && member.ColumnAttribute.IsAutoTrimmingEnabled) { foreach (DataRow row in table.Rows) { if (!row.IsNull(name)) { row[name] = ((string)row[name]).TrimEnd(); } } } } } dataSet.Merge(table); }
public T Get <T>(object key) where T : class { AdsEntityMapping mapping = AdsEntityMapping.GetForType(typeof(T)); var primaryKeyMappings = new List <AdsEntityMemberMapping>(); foreach (AdsEntityMemberMapping memberMapping in mapping.Members) { if (memberMapping.ColumnAttribute.IsPrimaryKey) { primaryKeyMappings.Add(memberMapping); } } if (primaryKeyMappings.Count == 0) { throw new AdsContextException("No primary key is defined for the class"); } if (primaryKeyMappings.Count > 1) { throw new AdsContextException("Multiple primary key columns are not supported"); } AdsEntityMemberMapping primaryKeyMapping = primaryKeyMappings[0]; string selectFilter = string.Format("{0} = :p_key", primaryKeyMapping.ResolvedName);; string query = CreateSelectQuery <T>(mapping, null, selectFilter, null); AdsCommand command = new AdsCommand(query, connection); command.Parameters.Add(":p_key", key); AdsDataReader reader = command.ExecuteReader(); if (reader.HasRows && reader.Read()) { T obj = (T)Activator.CreateInstance(typeof(T)); foreach (AdsEntityMemberMapping memberMapping in mapping.Members) { int resolvedNameOrdinal = reader.GetOrdinal(memberMapping.ResolvedName); object value = null; if (!reader.IsDBNull(resolvedNameOrdinal)) { value = reader.GetValue(resolvedNameOrdinal); if (memberMapping.MemberType == typeof(uint) && value is int) { value = (uint)(int)value; } if (memberMapping.MemberType == typeof(ushort) && value is short) { value = (ushort)(short)value; } } memberMapping.SetValue(obj, value); } return(obj); } return(null); }