Ejemplo n.º 1
0
        /// <summary>
        /// Método responsável por gerar comandos de inserção
        /// </summary>
        private string InsertParser()
        {
            var        sqlCommand   = new StringBuilder();
            var        propertyPart = new StringBuilder();
            var        valuePart    = new StringBuilder();
            EntityInfo info         = GetEntityInfo(Action.EntityFullName);
            var        typeMetadata = TypeSchema.GetTypeMetadata(Action.EntityFullName);

            Append("INSERT INTO ", sqlCommand).AppendTranslatedName(Translator.GetName(info), sqlCommand).Append(" (", sqlCommand);
            Tuple <int, IPropertyMetadata> identityKey = null;
            var  keysIndex    = new List <Tuple <int, IPropertyMetadata> >();
            bool isPosCommand = PrimaryKeyRepository.IsPosCommand(typeMetadata.FullName);
            bool isFirst      = true;

            for (int i = 0; i < Action.Parameters.Count; i++)
            {
                var parameter = Action.Parameters[i];
                if (string.IsNullOrEmpty(parameter.Name) || parameter.Name.StartsWith("?"))
                {
                    continue;
                }
                var propertyMetadata = typeMetadata[parameter.Name];
                SetParameterType(propertyMetadata, parameter);
                if (propertyMetadata.ParameterType == PersistenceParameterType.IdentityKey)
                {
                    identityKey = new Tuple <int, IPropertyMetadata>(i, propertyMetadata);
                    if (isPosCommand)
                    {
                        continue;
                    }
                }
                else if (propertyMetadata.ParameterType == PersistenceParameterType.Key)
                {
                    keysIndex.Add(new Tuple <int, IPropertyMetadata>(i, propertyMetadata));
                }
                if (!isFirst)
                {
                    Append(',', valuePart);
                    Append(',', propertyPart);
                }
                else
                {
                    isFirst = false;
                }
                var translatedName = Translator.GetName(info, propertyMetadata.Name);
                if (translatedName is TranslatedColumnName)
                {
                    AppendTranslatedName(translatedName, propertyPart);
                }
                else if (propertyMetadata.Name == Query.DataAccessConstants.RowVersionPropertyName)
                {
                    AppendQuoteExpression(Query.DataAccessConstants.RowVersionColumnName, propertyPart);
                }
                else
                {
                    throw new InvalidOperationException("Expected ColumnName for property \"" + propertyMetadata.Name + "\"");
                }
                Append('?', valuePart).Append(Action.Parameters[i].Name, valuePart);
            }
            Append(')', valuePart);
            Append(')', propertyPart);
            Append(propertyPart, sqlCommand).Append(" VALUES (", sqlCommand).Append(valuePart, sqlCommand);
            if (isPosCommand && identityKey != null)
            {
                Append(" SELECT ?", sqlCommand).Append(Action.Parameters[identityKey.Item1].Name, sqlCommand).Append("=SCOPE_IDENTITY()", sqlCommand);
            }
            if (identityKey != null)
            {
                keysIndex.Clear();
                keysIndex.Add(identityKey);
            }
            AppendGetRowVersionAndVolatilePropertiesExpression(info, keysIndex, typeMetadata, sqlCommand);
            return(sqlCommand.ToString());
        }
        /// <summary>
        /// Método responsável por gerar comandos de inserção
        /// </summary>
        private string InsertParser()
        {
            var           sqlCommand           = new StringBuilder();
            var           propertyPart         = new StringBuilder();
            var           valuePart            = new StringBuilder();
            StringBuilder generateIdentityPart = null;
            EntityInfo    info         = GetEntityInfo(Action.EntityFullName);
            var           typeMetadata = TypeSchema.GetTypeMetadata(Action.EntityFullName);

            sqlCommand.AppendLine("BEGIN");
            bool isFirst      = true;
            bool isPosCommand = PrimaryKeyRepository.IsPosCommand(typeMetadata.FullName);

            for (int i = 0; i < Action.Parameters.Count; i++)
            {
                var propertyMetadata = typeMetadata[Action.Parameters[i].Name];
                SetParameterType(propertyMetadata, Action.Parameters[i]);
                if (propertyMetadata.ParameterType == PersistenceParameterType.IdentityKey)
                {
                    if (isPosCommand)
                    {
                        generateIdentityPart = new StringBuilder();
                        Append("SELECT ", generateIdentityPart).AppendQuoteExpression(typeMetadata.TableName.Schema, generateIdentityPart).Append(".\"", generateIdentityPart).Append(typeMetadata.TableName.Name, generateIdentityPart).Append("_seq\".nextval INTO ?", generateIdentityPart).Append(Action.Parameters[i].Name, generateIdentityPart).Append(" FROM dual;", generateIdentityPart);
                    }
                }
                if (!isFirst)
                {
                    Append(',', valuePart);
                    Append(',', propertyPart);
                }
                else
                {
                    isFirst = false;
                }
                var translatedName = Translator.GetName(info, propertyMetadata.Name);
                if (translatedName is TranslatedColumnName)
                {
                    AppendTranslatedName(translatedName, propertyPart);
                }
                else if (propertyMetadata.Name == Query.DataAccessConstants.RowVersionPropertyName)
                {
                    AppendQuoteExpression(Query.DataAccessConstants.RowVersionColumnName.ToUpper(), propertyPart);
                }
                else
                {
                    throw new InvalidOperationException("Expected ColumnName for property \"" + propertyMetadata.Name + "\"");
                }
                Append('?', valuePart).Append(propertyMetadata.ColumnName, valuePart);
            }
            Append(')', valuePart);
            Append(')', propertyPart);
            if (generateIdentityPart != null)
            {
                sqlCommand.AppendLine(generateIdentityPart.ToString());
            }
            Append("INSERT INTO ", sqlCommand).AppendTranslatedName(Translator.GetName(info), sqlCommand).Append(" (", sqlCommand).Append(propertyPart, sqlCommand).Append(" VALUES (", sqlCommand).Append(valuePart, sqlCommand);
            sqlCommand.AppendLine(";");
            AppendGetRowsAffectedExpression(sqlCommand);
            sqlCommand.AppendLine("END;");
            return(sqlCommand.ToString());
        }