示例#1
0
        public MemoryDbDataReader.ResultBatch Execute(Dictionary <string, Table> tables, RawData rawData,
                                                      SqlQuerySpecification sqlQuery,
                                                      SqlOrderByClause orderByClause = null)
        {
            if (sqlQuery.FromClause != null)
            {
                rawData.AddTablesFromClause(sqlQuery.FromClause, tables);
                if (sqlQuery.WhereClause != null)
                {
                    rawData.ExecuteWhereClause(sqlQuery.WhereClause);
                }
            }
            else
            {
                // We do not select data from any table, so we insert an empty row to trigger a result in AddData().
                rawData.RawRowList.Add(new RawTableJoinRow());
            }

            var batch = InitializeBatch(rawData, sqlQuery);

            if (sqlQuery.GroupByClause != null)
            {
                rawData.AddGroupByClause(sqlQuery.GroupByClause);
            }

            rawData.HavingClause = sqlQuery.HavingClause?.Expression;
            rawData.SortOrder    = GetSortOrder(orderByClause, sqlQuery);

            new QueryResultBuilder(rawData, sqlQuery.SelectClause.IsDistinct).AddData(batch);
            if (sqlQuery.IntoClause != null)
            {
                InsertIntoTable(sqlQuery.IntoClause, tables, batch);
            }
            return(batch);
        }
示例#2
0
        private RawData GetRowsForDelete(Dictionary <string, Table> tables, SqlDeleteStatement deleteStatement)
        {
            var rawData = new RawData(_Command);

            var specification = deleteStatement.DeleteSpecification;

            if (specification.FromClause != null)
            {
                rawData.AddTablesFromClause(specification.FromClause, tables);
            }
            else
            {
                rawData.AddTable(specification.Target, tables);
            }

            if (specification.WhereClause != null)
            {
                rawData.ExecuteWhereClause(specification.WhereClause);
            }

            if (specification.TopSpecification != null)
            {
                var rowCount = int.Parse(specification.TopSpecification.Value.Sql);
                rawData.RawRowList = rawData.RawRowList.Take(rowCount).ToList( );
            }

            return(rawData);
        }
示例#3
0
        public void Execute(Dictionary <string, Table> tables, SqlUpdateStatement updateStatement)
        {
            var rawData = new RawData(_Command);

            var specification = updateStatement.UpdateSpecification;

            rawData.AddTable(specification.Target, tables);
            if (specification.WhereClause != null)
            {
                rawData.ExecuteWhereClause(specification.WhereClause);
            }

            var updatedRows = new List <UpdatedRow>( );

            foreach (var assignment in specification.SetClause.Assignments)
            {
                switch (assignment)
                {
                case SqlColumnAssignment columnAssignment:
                    var tableColumn = Helper.GetTableColumn((SqlObjectIdentifier)(columnAssignment.Column.MultipartIdentifier), rawData);
                    if (tableColumn.Column.IsIdentity && tableColumn.Column.ParentTable.IsIdentityInsertForbidden || tableColumn.Column.IsRowVersion)
                    {
                        throw new SqlUpdateColumnForbiddenException(tableColumn.Column.Name);
                    }

                    foreach (var row in rawData.RawRowList)
                    {
                        var value       = Helper.GetValue(columnAssignment.Value, tableColumn.Column.NetDataType, rawData, row);
                        var updateTable = row.Single(r => r.Name == tableColumn.TableName);
                        updateTable.Row[tableColumn.Column.Order] = value;
                        if (updatedRows.Any(u => u.Row == updateTable.Row) == false)
                        {
                            var updateRow = new UpdatedRow {
                                Columns = updateTable.Table.Columns, Row = updateTable.Row
                            };
                            updatedRows.Add(updateRow);
                        }
                    }
                    break;

                default:
                    throw new NotImplementedException();
                }
            }

            UpdateRowVersions(updatedRows);
            _Command.RowsAffected = rawData.RawRowList.Count;
        }