示例#1
0
        /// <summary>
        ///     Return the value of the specified field.
        /// </summary>
        /// <param name="i">The index of the field to find.</param>
        /// <returns>
        ///     The <see cref="T:System.Object" /> which will contain the field value upon return.
        /// </returns>
        public virtual object GetValue(int i)
        {
            if (i == -1)
            {
                return(DBNull.Value);
            }
            if (i >= _baseElement.Elements().Count())
            {
                return(DBNull.Value);
            }

            var name = GetName(i);

            var mapEntiysPropToSchema = _target.GetDbToLocalSchemaMapping(name);

            var firstOrDefault = _target.GetPropertiesEx().FirstOrDefault(s => s.Name == mapEntiysPropToSchema);

            if (firstOrDefault == null)
            {
                return(DBNull.Value);
            }

            var propertyType = firstOrDefault.PropertyType;
            var xElement     = _baseElement.Elements().ElementAt(i);

            if (xElement.HasElements)
            {
                return(xElement.ToString());
            }

            var type = DataConverterExtensions.ChangeType(xElement.Value, propertyType);

            return(type);
        }
        /// <summary>
        ///     Create a Update statement that will update the entry in the Database
        /// </summary>
        /// <param name="database">The database.</param>
        /// <param name="classInfo">The class information.</param>
        /// <param name="entry">The entry.</param>
        /// <returns></returns>
        /// <exception cref="Exception">No primarykey Provied. An autogenerated Update statement could not be created</exception>
        public static IDbCommand CreateUpdate(IDatabase database, DbClassInfoCache classInfo, object entry)
        {
            var pkProperty = classInfo.PrimaryKeyProperty;

            if (pkProperty == null)
            {
                throw new Exception("No primarykey Provied. An autogenerated Update statement could not be created");
            }
            var pk = classInfo.SchemaMappingLocalToDatabase(pkProperty.PropertyName);

            var identityInsert = DbIdentityInsertScope.Current != null;
            var ignore         =
                classInfo
                .Propertys
                .Select(f => f.Value)
                .Where(s => (!identityInsert && s.PrimaryKeyAttribute != null) || s.InsertIgnore || s.UpdateIgnore || s.ForginKeyAttribute != null)
                .Select(s => s.DbName)
                .ToArray();

            if (identityInsert)
            {
                DbIdentityInsertScope.Current.EnableIdentityModfiy(classInfo.TableName, database);
            }

            var propertyInfos = classInfo.FilterDbSchemaMapping(ignore).ToArray();

            var sb = new StringBuilder();

            sb.Append("UPDATE ");
            sb.Append(classInfo.TableName);
            sb.Append(" SET ");
            var para = new List <IQueryParameter>();

            for (var index = 0; index < propertyInfos.Length; index++)
            {
                var info       = propertyInfos[index];
                var schemaName = classInfo.GetDbToLocalSchemaMapping(info);
                DbPropertyInfoCache property;
                classInfo.Propertys.TryGetValue(schemaName, out property);
                var dataValue = DataConverterExtensions.GetDataValue(property.GetConvertedValue(entry));
                para.Add(new QueryParameter(index.ToString(), dataValue, property.PropertyType));
                sb.Append(string.Format(" {0} = @{1} ", info, index));
                if (index + 1 < propertyInfos.Length)
                {
                    sb.Append(",");
                }
            }

            para.Add(new QueryParameter("pkValue", pkProperty.Getter.Invoke(entry), pkProperty.PropertyType));

            sb.Append(string.Format("WHERE {0} = @pkValue ", pk));

            return(database.CreateCommandWithParameterValues(sb.ToString(), para.ToArray()));
        }
        /// <summary>
        ///     Create a Update statement that will update the entry in the Database
        /// </summary>
        /// <param name="database">The database.</param>
        /// <param name="classInfo">The class information.</param>
        /// <param name="entry">The entry.</param>
        /// <returns></returns>
        /// <exception cref="Exception">No primarykey Provied. An autogenerated Update statement could not be created</exception>
        public static IDbCommand CreateUpdateSimple(IDatabase database, DbClassInfoCache classInfo, object entry)
        {
            var ignore =
                classInfo
                .Propertys
                .Select(f => f.Value)
                .Where(s => s.PrimaryKeyAttribute != null || s.InsertIgnore || s.UpdateIgnore || s.ForginKeyAttribute != null)
                .Select(s => s.DbName)
                .ToArray();

            var propertyInfos = classInfo.FilterDbSchemaMapping(ignore).ToArray();

            var sb = new StringBuilder();

            sb.Append("UPDATE ");
            sb.Append(classInfo.TableName);
            sb.Append(" SET ");
            var para = new List <IQueryParameter>();

            for (var index = 0; index < propertyInfos.Length; index++)
            {
                var info       = propertyInfos[index];
                var schemaName = classInfo.GetDbToLocalSchemaMapping(info);
                DbPropertyInfoCache property;
                classInfo.Propertys.TryGetValue(schemaName, out property);
                var dataValue = DataConverterExtensions.GetDataValue(property.GetConvertedValue(entry));
                para.Add(new QueryParameter(index.ToString(), dataValue, property.PropertyType));
                sb.Append(string.Format(" {0} = @{1} ", info, index));
                if (index + 1 < propertyInfos.Length)
                {
                    sb.Append(",");
                }
            }

            return(database.CreateCommandWithParameterValues(sb.ToString(), para.ToArray()));
        }