private string FormulateDelete(DataObject dataObject) { _opBuilder.Clear(); _opBuilder.Append("DELETE FROM ["); _opBuilder.Append(Connection.SchemaName + "].[" + dataObject.TableName); _opBuilder.Append("]"); _whereBuilder.Clear(); _whereBuilder.Append(" WHERE "); BindingInfo[] bindInfos = GetBindingInfo(dataObject.GetType()); bool firstPK = true; string dateFormat = Connection.GetDBDateFormat(); foreach (BindingInfo bind in bindInfos) { // Add PKs to the WHERE clause. if (bind.PrimaryKey) { object val; if (bind.Member is PropertyInfo) { val = ((PropertyInfo)bind.Member).GetValue(dataObject, null); } else if (bind.Member is FieldInfo) { val = ((FieldInfo)bind.Member).GetValue(dataObject); } else { continue; } if (!firstPK) { _whereBuilder.Append(" AND "); } else { firstPK = false; } val = ConvertVal(val, dateFormat); _whereBuilder.Append("[" + bind.Member.Name + "] = "); _whereBuilder.Append('\''); _whereBuilder.Append(val); _whereBuilder.Append('\''); } } // Object has no PKs within its elements, so use the ObjectId to target the save. if (firstPK) { _whereBuilder.Append($"[{dataObject.TableName}_ID] = '{Escape(dataObject.ObjectId)}'"); } return(_opBuilder.Append(_whereBuilder).ToString()); }
protected void FillRowWithObject(DataObject dataObject, DataRow row) { bool relation = false; Type myType = dataObject.GetType(); row[dataObject.TableName + "_ID"] = dataObject.ObjectId; MemberInfo[] myMembers = myType.GetMembers(); for (int i = 0; i < myMembers.Length; i++) { object[] myAttributes = GetRelationAttributes(myMembers[i]); object val = null; if (myAttributes.Length > 0) { relation = true; } else { myAttributes = myMembers[i].GetCustomAttributes(typeof(DataElement), true); object[] keyAttrib = myMembers[i].GetCustomAttributes(typeof(PrimaryKey), true); if (myAttributes.Length > 0 || keyAttrib.Length > 0) { if (myMembers[i] is PropertyInfo) { val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null); } if (myMembers[i] is FieldInfo) { val = ((FieldInfo)myMembers[i]).GetValue(dataObject); } if (val != null) { row[myMembers[i].Name] = val; } } } //} } if (relation) { SaveObjectRelations(dataObject); } }
protected DataRow FindRowByKey(DataObject dataObject) { DataRow row; string tableName = dataObject.TableName; System.Data.DataTable table = GetDataSet(tableName).Tables[tableName]; Type myType = dataObject.GetType(); string key = table.PrimaryKey[0].ColumnName; if (key.Equals(tableName + "_ID")) { row = table.Rows.Find(dataObject.ObjectId); } else { MemberInfo[] keymember = myType.GetMember(key); object val = null; if (keymember[0] is PropertyInfo) { val = ((PropertyInfo)keymember[0]).GetValue(dataObject, null); } if (keymember[0] is FieldInfo) { val = ((FieldInfo)keymember[0]).GetValue(dataObject); } if (val != null) { row = table.Rows.Find(val); } else { return(null); } } return(row); }
protected void FillLazyObjectRelations(DataObject dataObject, bool autoload) { try { var dataObjectType = dataObject.GetType(); MemberInfo[] myMembers; if (!MemberInfoCache.TryGetValue(dataObjectType, out myMembers)) { myMembers = dataObjectType.GetMembers(); MemberInfoCache[dataObjectType] = myMembers; } for (int i = 0; i < myMembers.Length; i++) { Relation[] myAttributes = GetRelationAttributes(myMembers[i]); if (myAttributes.Length > 0) { Relation rel = myAttributes[0]; if ((rel.AutoLoad == false) && autoload) { continue; } bool isArray = false; Type remoteType; DataObject[] elements; string local = rel.LocalField; string remote = rel.RemoteField; if (myMembers[i] is PropertyInfo) { remoteType = ((PropertyInfo)myMembers[i]).PropertyType; } else { remoteType = ((FieldInfo)myMembers[i]).FieldType; } if (remoteType.HasElementType) { remoteType = remoteType.GetElementType(); isArray = true; } PropertyInfo prop = dataObjectType.GetProperty(local); FieldInfo field = dataObjectType.GetField(local); object val = 0; if (prop != null) { val = prop.GetValue(dataObject, null); } if (field != null) { val = field.GetValue(dataObject); } if (val != null && val.ToString() != string.Empty) { if (DataObject.GetPreCachedFlag(remoteType)) { elements = new DataObject[1]; elements[0] = FindObjectByKeyImpl(remoteType, val); } else { elements = SelectObjectsImpl(remoteType, remote + " = '" + Escape(val.ToString()) + "'", IsolationLevel.DEFAULT); } if ((elements != null) && (elements.Length > 0)) { if (isArray) { if (myMembers[i] is PropertyInfo) { ((PropertyInfo)myMembers[i]).SetValue(dataObject, elements, null); } if (myMembers[i] is FieldInfo) { var currentField = (FieldInfo)myMembers[i]; ConstructorInfo constructor; if (!ConstructorByFieldType.TryGetValue(currentField.FieldType, out constructor)) { constructor = currentField.FieldType.GetConstructor(new[] { typeof(int) }); ConstructorByFieldType[currentField.FieldType] = constructor; } object elementHolder = constructor.Invoke(new object[] { elements.Length }); var elementArray = (object[])elementHolder; for (int m = 0; m < elementArray.Length; m++) { elementArray[m] = elements[m]; } currentField.SetValue(dataObject, elementArray); } } else { if (myMembers[i] is PropertyInfo) { ((PropertyInfo)myMembers[i]).SetValue(dataObject, elements[0], null); } if (myMembers[i] is FieldInfo) { ((FieldInfo)myMembers[i]).SetValue(dataObject, elements[0]); } } } } } } } catch (Exception e) { throw new DatabaseException("Resolving Relations for " + dataObject.TableName + " failed!", e); } }
protected void DeleteObjectRelations(DataObject dataObject) { try { object val; Type myType = dataObject.GetType(); MemberInfo[] myMembers = myType.GetMembers(); for (int i = 0; i < myMembers.Length; i++) { Relation[] myAttributes = GetRelationAttributes(myMembers[i]); if (myAttributes.Length > 0) { //if(myAttributes[0] is Attributes.Relation) //{ if (myAttributes[0].AutoDelete == false) { continue; } bool array = false; Type type; if (myMembers[i] is PropertyInfo) { type = ((PropertyInfo)myMembers[i]).PropertyType; } else { type = ((FieldInfo)myMembers[i]).FieldType; } if (type.HasElementType) { type = type.GetElementType(); array = true; } val = null; if (array) { if (myMembers[i] is PropertyInfo) { val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null); } if (myMembers[i] is FieldInfo) { val = ((FieldInfo)myMembers[i]).GetValue(dataObject); } if (val is Array) { var a = val as Array; foreach (object o in a) { if (o is DataObject) { DeleteObject(o as DataObject); } } } else { if (val is DataObject) { DeleteObject(val as DataObject); } } } else { if (myMembers[i] is PropertyInfo) { val = ((PropertyInfo)myMembers[i]).GetValue(dataObject, null); } if (myMembers[i] is FieldInfo) { val = ((FieldInfo)myMembers[i]).GetValue(dataObject); } if (val != null && val is DataObject) { DeleteObject(val as DataObject); } } //} } } } catch (Exception e) { throw new DatabaseException("Resolving Relations failed !", e); } }
public BindingInfo(DataObject assignObject, MemberInfo member, bool primaryKey, bool hasRelation, bool readOnly, DataElement attrib) { Member = member; // Used for the compiled expression method for assigning to properties and fields. MySqlBinder = (MySqlExpressionDataBinder)typeof(MySqlExpressionDataBinder).GetMethod("GetFor").MakeGenericMethod(assignObject.GetType()).Invoke(null, new object[] { member }); PrimaryKey = primaryKey; HasRelation = hasRelation; DataElementAttribute = attrib; ReadOnly = readOnly; }
private string FormulateUpdate(DataObject dataObject, out bool hasRelations) { string tableName = dataObject.TableName; _opBuilder.Clear(); _opBuilder.Append("UPDATE [" + Connection.SchemaName + "].[" + tableName + "] SET "); _whereBuilder.Clear(); _whereBuilder.Append(" WHERE "); BindingInfo[] bindInfos = GetBindingInfo(dataObject.GetType()); hasRelations = false; bool first = true; bool firstPK = true; string dateFormat = Connection.GetDBDateFormat(); foreach (BindingInfo bind in bindInfos) { if (bind.ReadOnly) { continue; } if (!hasRelations) { hasRelations = bind.HasRelation; } // Add PKs to the WHERE clause. if (bind.PrimaryKey) { object val; if (bind.Member is PropertyInfo) { val = ((PropertyInfo)bind.Member).GetValue(dataObject, null); } else if (bind.Member is FieldInfo) { val = ((FieldInfo)bind.Member).GetValue(dataObject); } else { continue; } if (!firstPK) { _whereBuilder.Append(" AND "); } else { firstPK = false; } val = ConvertVal(val, dateFormat); _whereBuilder.Append("[" + bind.Member.Name + "] = "); _whereBuilder.Append('\''); _whereBuilder.Append(val); _whereBuilder.Append('\''); } // Add other elements to the SET clause. else if (!bind.HasRelation) { object val; if (bind.Member is PropertyInfo) { val = ((PropertyInfo)bind.Member).GetValue(dataObject, null); } else if (bind.Member is FieldInfo) { val = ((FieldInfo)bind.Member).GetValue(dataObject); } else { continue; } if (!first) { _opBuilder.Append(", "); } else { first = false; } val = ConvertVal(val, dateFormat); _opBuilder.Append("[" + bind.Member.Name + "] = "); _opBuilder.Append('\''); _opBuilder.Append(val); _opBuilder.Append('\''); } } // Object has no PKs within its elements, so use the ObjectId to target the save. if (firstPK) { _whereBuilder.Append($"[{tableName}_ID] = '{Escape(dataObject.ObjectId)}'"); } _opBuilder.Append(_whereBuilder); return(_opBuilder.ToString()); }
private string FormulateInsert(DataObject dataObject, out bool hasRelations) { string tableName = dataObject.TableName; var columns = new StringBuilder(); var values = new StringBuilder(); BindingInfo[] bindInfos = GetBindingInfo(dataObject.GetType()); hasRelations = false; bool first = true; string dateFormat = Connection.GetDBDateFormat(); if (TableDatasets[tableName].RequiresObjectId) { first = false; if (dataObject.ObjectId == null) { dataObject.ObjectId = IDGenerator.GenerateID(); } columns.Append("[" + tableName + "_ID]"); values.Append("'" + Escape(dataObject.ObjectId) + "'"); } foreach (BindingInfo bindInfo in bindInfos) { if (bindInfo.HasRelation) { hasRelations = true; } // Check whether or not this class member is a primary key or a data element // and is thus valid for saving if (bindInfo.PrimaryKey || bindInfo.DataElementAttribute != null) { object val = null; if (bindInfo.Member is PropertyInfo) { val = ((PropertyInfo)bindInfo.Member).GetValue(dataObject, null); } else if (bindInfo.Member is FieldInfo) { val = ((FieldInfo)bindInfo.Member).GetValue(dataObject); } if (!first) { columns.Append(", "); values.Append(", "); } else { first = false; } columns.Append("[" + bindInfo.Member.Name + "]"); val = ConvertVal(val, dateFormat); values.Append('\''); values.Append(val); values.Append('\''); } } return("INSERT INTO [" + Connection.SchemaName + "].[" + tableName + "] (" + columns + ") VALUES (" + values + ")"); }
// Ajoute un nouvel objet a la DB protected override bool AddObjectImpl(DataObject dataObject) { try { string tableName = dataObject.TableName; if (dataObject.ObjectId == null) { dataObject.ObjectId = IDGenerator.GenerateID(); } var columns = new StringBuilder(); var values = new StringBuilder(); MemberInfo[] objMembers = dataObject.GetType().GetMembers(); bool hasRelations = false; string dateFormat = Connection.GetDBDateFormat(); columns.Append("`" + tableName + "_ID`"); values.Append("'" + Escape(dataObject.ObjectId) + "'"); for (int i = 0; i < objMembers.Length; i++) { if (!hasRelations) { object[] relAttrib = GetRelationAttributes(objMembers[i]); hasRelations = relAttrib.Length > 0; } object[] keyAttrib = objMembers[i].GetCustomAttributes(typeof(PrimaryKey), true); object[] attrib = objMembers[i].GetCustomAttributes(typeof(DataElement), true); if (attrib.Length > 0 || keyAttrib.Length > 0) { object val = null; if (objMembers[i] is PropertyInfo) { val = ((PropertyInfo)objMembers[i]).GetValue(dataObject, null); } else if (objMembers[i] is FieldInfo) { val = ((FieldInfo)objMembers[i]).GetValue(dataObject); } columns.Append(", "); values.Append(", "); columns.Append("`" + objMembers[i].Name + "`"); val = ConvertVal(val, dateFormat); values.Append('\''); values.Append(val); values.Append('\''); } } string sql = "INSERT INTO `" + tableName + "` (" + columns + ") VALUES (" + values + ")"; Log.Debug("MysqlObject", sql); int res = Connection.ExecuteNonQuery(sql); if (res == 0) { Log.Error("MysqlObject", "Add Error : " + dataObject.TableName + " ID=" + dataObject.ObjectId + "Query = " + sql); return(false); } if (hasRelations) { SaveObjectRelations(dataObject); } dataObject.Dirty = false; dataObject.IsValid = true; dataObject.IsDeleted = false; return(true); } catch (Exception e) { Log.Error("MysqlObject", "Add Error : " + dataObject.TableName + " " + dataObject.ObjectId + e.ToString()); } return(false); }
// Persiste l'objet dans la DB protected override void SaveObjectImpl(DataObject dataObject) { try { string tableName = dataObject.TableName; var sb = new StringBuilder("UPDATE `" + tableName + "` SET "); BindingInfo[] bindingInfo = GetBindingInfo(dataObject.GetType()); bool hasRelations = false; bool first = true; string dateFormat = Connection.GetDBDateFormat(); for (int i = 0; i < bindingInfo.Length; i++) { BindingInfo bind = bindingInfo[i]; if (bind.ReadOnly) { continue; } if (!hasRelations) { hasRelations = bind.HasRelation; } if (!bind.HasRelation) { object val = null; if (bind.Member is PropertyInfo) { val = ((PropertyInfo)bind.Member).GetValue(dataObject, null); } else if (bind.Member is FieldInfo) { val = ((FieldInfo)bind.Member).GetValue(dataObject); } else { continue; } if (!first) { sb.Append(", "); } else { first = false; } val = ConvertVal(val, dateFormat); sb.Append("`" + bind.Member.Name + "` = "); sb.Append('\''); sb.Append(val); sb.Append('\''); } } sb.Append(" WHERE `" + tableName + "_ID` = '" + Escape(dataObject.ObjectId) + "'"); string sql = sb.ToString(); Log.Debug("MysqlObject", sql); int res = Connection.ExecuteNonQuery(sql); if (res == 0) { Log.Error("MysqlObject", "Modify error : " + dataObject.TableName + " ID=" + dataObject.ObjectId + " --- keyvalue changed? " + sql + " " + Environment.StackTrace); return; } if (hasRelations) { SaveObjectRelations(dataObject); } dataObject.Dirty = false; dataObject.IsValid = true; } catch (Exception e) { Log.Error("MysqlObject", "Modify error : " + dataObject.TableName + " " + dataObject.ObjectId + e.ToString()); } }