示例#1
0
        internal override string CreateSaveList(TableInfo baseClass, ForeignKeyInfo fkInfo, EntityBase baseInstance, out TenorParameter[] parameters, out System.Data.DataTable data)
        {
            IList values = (IList)fkInfo.PropertyValue(baseInstance);

            data = new System.Data.DataTable();

            for (int i = 0; i < fkInfo.LocalManyToManyFields.Length; i++)
            {
                data.Columns.Add(fkInfo.LocalManyToManyFields[i], fkInfo.LocalFields[i].RelatedProperty.PropertyType);
            }

            for (int i = 0; i < fkInfo.ForeignManyToManyFields.Length; i++)
            {
                data.Columns.Add(fkInfo.ForeignManyToManyFields[i], fkInfo.ForeignFields[i].RelatedProperty.PropertyType);
            }


            for (int i = 0; i < values.Count; i++)
            {
                System.Data.DataRow row = data.NewRow();
                for (int j = 0; j < fkInfo.LocalManyToManyFields.Length; j++)
                {
                    row[fkInfo.LocalManyToManyFields[j]] = fkInfo.LocalFields[j].PropertyValue(baseInstance);
                }
                for (int j = 0; j < fkInfo.ForeignFields.Length; j++)
                {
                    row[fkInfo.ForeignManyToManyFields[j]] = fkInfo.ForeignFields[j].PropertyValue(values[i]);
                }
                data.Rows.Add(row);
            }
            const string localParamPrefix = "local{0}";

            List <TenorParameter> parame = new List <TenorParameter>();
            string tableExpression       = GetPrefixAndTable(fkInfo.ManyToManyTablePrefix, fkInfo.ManyToManyTable);
            // generating delete statement
            StringBuilder sql = new StringBuilder();

            sql.Append(string.Format("DELETE FROM {0} WHERE ", tableExpression));
            for (int i = 0; i < fkInfo.LocalManyToManyFields.Length; i++)
            {
                if (i > 0)
                {
                    sql.Append(this.GetOperator(LogicalOperator.And));
                }
                sql.Append(this.CommandBuilder.QuoteIdentifier(fkInfo.LocalManyToManyFields[i]));
                sql.Append(" = ");
                sql.Append(this.ParameterIdentifier + string.Format(localParamPrefix, i));

                TenorParameter p = new TenorParameter(string.Format(localParamPrefix, i), fkInfo.LocalFields[i].PropertyValue(baseInstance));
                parame.Add(p);
            }
            parameters = parame.ToArray();
            sql.AppendLine();
            return(sql.ToString());
        }
示例#2
0
        public override string CreateSaveListSql(string tableNameExpression, string[] localFields, object[] localValues, string[] foreignFields, object[,] propertyValues, out TenorParameter[] parameters)
        {
            const string          localParamPrefix = "local{0}";
            List <TenorParameter> parameterList    = new List <TenorParameter>();

            for (int i = 0; i < localValues.Length; i++)
            {
                TenorParameter p = new TenorParameter(string.Format(localParamPrefix, i), localValues[i]);
                parameterList.Add(p);
            }

            StringBuilder sql = new StringBuilder();

            sql.Append(string.Format("DELETE FROM {0} WHERE ", tableNameExpression));
            for (int i = 0; i < localFields.Length; i++)
            {
                if (i > 0)
                {
                    sql.Append(this.GetOperator(LogicalOperator.And));
                }
                sql.Append(this.CommandBuilder.QuoteIdentifier(localFields[i]));
                sql.Append(" = ");
                sql.Append(this.ParameterIdentifier + string.Format(localParamPrefix, i));
            }
            sql.AppendLine(LineEnding);
            sql.AppendLine(Helper.GoStatement);
            if (propertyValues.GetUpperBound(0) > -1) // if we have values on the list
            {
                sql.Append(string.Format("INSERT INTO {0} (", tableNameExpression));
                for (int i = 0; i < localFields.Length; i++)
                {
                    if (i > 0)
                    {
                        sql.Append(", ");
                    }
                    sql.Append(this.CommandBuilder.QuoteIdentifier(localFields[i]));
                }
                for (int i = 0; i < foreignFields.Length; i++)
                {
                    sql.Append(", ");
                    sql.Append(this.CommandBuilder.QuoteIdentifier(foreignFields[i]));
                }
                sql.AppendLine(") ");

                for (int i = 0; i <= propertyValues.GetUpperBound(0); i++)
                {
                    if (i > 0)
                    {
                        sql.Append(" UNION ALL ");
                    }

                    sql.Append(" SELECT ");
                    for (int j = 0; j < localFields.Length; j++)
                    {
                        if (j > 0)
                        {
                            sql.Append(", ");
                        }
                        sql.Append(this.ParameterIdentifier + string.Format(localParamPrefix, j));
                    }
                    for (int j = 0; j < foreignFields.Length; j++)
                    {
                        sql.Append(", ");

                        string value = string.Empty;
                        Type   type  = propertyValues[i, j].GetType();
                        if (type == typeof(string) || type == typeof(DateTime))
                        {
                            value = string.Format("'{0}'", propertyValues[i, j].ToString().Replace("'", "''"));
                        }
                        else if (type.IsEnum)
                        {
                            //TODO: Support converting enums to char and strings for legacy databases.
                            value = ((long)propertyValues[i, j]).ToString();
                        }
                        else
                        {
                            value = propertyValues[i, j].ToString();
                        }

                        sql.Append(value);
                    }
                    sql.AppendLine("");
                }

                sql.Append(LineEnding);
            }
            parameters = parameterList.ToArray();
            return(sql.ToString());
        }