internal ExecuteBlockInsertSql GetInsertSql(FbInsertSqlContext insertContext, InsertColumn[] insertValues, bool resultRequired, bool skipCommandParameters)
        {
            List<string> columnsList = new List<string>(insertValues.Length);
            List<string> valuesList = new List<string>(insertValues.Length);
            List<string> parametersList = new List<string>(insertValues.Length);
            int parametersSize = 0;

            for (int i = 0; i < insertValues.Length; i++)
            {
                var currentValue = insertValues[i];
                columnsList.Add(currentValue.Column.QuotedName);

                if (skipCommandParameters && CanSkipCommandParameterFor(currentValue))
                {
                    valuesList.Add(currentValue.ValueToSql());
                }
                else
                {
                    if (currentValue.ParameterName == null)
                        currentValue.ParameterName = GetNextParameterName(insertContext);

                    valuesList.Add(":" + currentValue.ParameterName);
                    parametersList.Add(String.Format("{0} {1}=@{0}", currentValue.ParameterName,
                        currentValue.ValueParameterToSql()));
                    parametersSize += currentValue.Column.Size + ParameterSizeInBytes;
                }
            }

            string insertSql;
            if (resultRequired)
            {
                insertSql = String.Format("INSERT INTO {0} ({1}) VALUES({2}) RETURNING {3} into {4};suspend;",
                    insertContext.TableName, String.Join(",", columnsList), String.Join(",", valuesList), insertContext.ReturnsColumnSql, insertContext.ReturnsVariablesSql);
            }
            else
            {
                insertSql = String.Format("INSERT INTO {0} ({1}) VALUES({2});", insertContext.TableName, String.Join(",", columnsList), String.Join(",", valuesList));
            }

            return new ExecuteBlockInsertSql(String.Join(",", parametersList), insertSql, parametersSize);
        }
        private IDictionary<string, object> CreateAndExecuteInsertCommand(IDbConnection connection, Table table, InsertColumn[] insertColumns, bool resultRequired, IDbTransaction transaction = null)
        {
            using (var command = connection.CreateCommand())
            {
                command.Transaction = transaction;
                command.CommandText = GetInsertSql(table, insertColumns, resultRequired);

                var columnParameters = new Dictionary<string,FbParameter>(insertColumns.Length);

                foreach (var insertColumn in insertColumns)
                {
                    columnParameters[insertColumn.Name] = new FbParameter
                    {
                        ParameterName = insertColumn.ParameterName,
                        Value = insertColumn.Value,
                        Direction = resultRequired ? ParameterDirection.InputOutput : ParameterDirection.Input
                    };

                    command.Parameters.Add(columnParameters[insertColumn.Name]);
                }

                return ExecuteInsertCommand(command, columnParameters, resultRequired);
            }
        }
 private string GetInsertSql(Table table, InsertColumn[] insertData, bool resultRequired)
 {
     string columnsSql = String.Join(",", insertData.Select(s => s.Column.QuotedName));
     string valuesSql = String.Join(",", insertData.Select(c => c.ParameterName));
     
     if (resultRequired) return string.Format("INSERT INTO {0} ({1}) VALUES({2}) RETURNING {1};", table.QualifiedName, columnsSql, valuesSql);
     else return string.Format("INSERT INTO {0} ({1}) VALUES({2});", table.QualifiedName, columnsSql, valuesSql);
 }
 private bool CanSkipCommandParameterFor(InsertColumn insertColumn)
 {
     return(insertColumn.Value == null || !insertColumn.Value.GetType().IsArray);
 }
 internal ExecuteBlockInsertSql GetInsertSql(FbInsertSqlContext insertContext, InsertColumn[] insertValues, bool resultRequired)
 {
     return GetInsertSql(insertContext, insertValues, resultRequired, insertContext.SkipCommandParameters);
 }
 private bool CanSkipCommandParameterFor(InsertColumn insertColumn)
 {
     return insertColumn.Value == null || !insertColumn.Value.GetType().IsArray;
 }