Example #1
0
        public override void MakeDistinct(DatabaseOperationArgs args, DiscoveredTable discoveredTable)
        {
            var syntax = discoveredTable.GetQuerySyntaxHelper();

            string sql =
                @"DELETE f
            FROM (
            SELECT	ROW_NUMBER() OVER (PARTITION BY {0} ORDER BY {0}) AS RowNum
            FROM {1}
            
            ) as f
            where RowNum > 1";

            string columnList = string.Join(",",
                                            discoveredTable.DiscoverColumns().Select(c => syntax.EnsureWrapped(c.GetRuntimeName())));

            string sqlToExecute = string.Format(sql, columnList, discoveredTable.GetFullyQualifiedName());

            var server = discoveredTable.Database.Server;

            using (var con = args.GetManagedConnection(server))
            {
                using (var cmd = server.GetCommand(sqlToExecute, con))
                    args.ExecuteNonQuery(cmd);
            }
        }
 public virtual int GetRowCount(DatabaseOperationArgs args, DiscoveredTable table)
 {
     using (IManagedConnection connection = args.GetManagedConnection(table))
     {
         using (var cmd = table.Database.Server.GetCommand("SELECT count(*) FROM " + table.GetFullyQualifiedName(), connection))
             return(Convert.ToInt32(args.ExecuteScalar(cmd)));
     }
 }
        public virtual void AddColumn(DatabaseOperationArgs args, DiscoveredTable table, string name, string dataType, bool allowNulls)
        {
            var syntax = table.GetQuerySyntaxHelper();

            using (var con = args.GetManagedConnection(table))
            {
                using (var cmd = table.Database.Server.GetCommand("ALTER TABLE " + table.GetFullyQualifiedName() + " ADD " + syntax.EnsureWrapped(name) + " " + dataType + " " + (allowNulls ? "NULL" : "NOT NULL"), con))
                    args.ExecuteNonQuery(cmd);
            }
        }
        public virtual void FillDataTableWithTopX(DatabaseOperationArgs args, DiscoveredTable table, int topX, DataTable dt)
        {
            string sql = GetTopXSqlForTable(table, topX);

            using (var con = args.GetManagedConnection(table))
            {
                using (var cmd = table.Database.Server.GetCommand(sql, con))
                    using (var da = table.Database.Server.GetDataAdapter(cmd))
                        args.Fill(da, cmd, dt);
            }
        }
        public virtual void MakeDistinct(DatabaseOperationArgs args, DiscoveredTable discoveredTable)
        {
            var server = discoveredTable.Database.Server;

            //if it's got a primary key they it's distinct! job done
            if (discoveredTable.DiscoverColumns().Any(c => c.IsPrimaryKey))
            {
                return;
            }

            var tableName = discoveredTable.GetFullyQualifiedName();
            var tempTable = discoveredTable.Database.ExpectTable(discoveredTable.GetRuntimeName() + "_DistinctingTemp").GetFullyQualifiedName();


            using (var con = args.TransactionIfAny == null
                ? server.BeginNewTransactedConnection()
                :                                               //start a new transaction
                             args.GetManagedConnection(server)) //or continue the ongoing transaction
            {
                using (var cmdDistinct =
                           server.GetCommand(
                               string.Format("CREATE TABLE {1} AS SELECT distinct * FROM {0}", tableName, tempTable), con))
                    args.ExecuteNonQuery(cmdDistinct);

                //this is the point of no return so don't cancel after this point
                using (var cmdTruncate = server.GetCommand(string.Format("DELETE FROM {0}", tableName), con))
                {
                    cmdTruncate.CommandTimeout = args.TimeoutInSeconds;
                    cmdTruncate.ExecuteNonQuery();
                }

                using (var cmdBack = server.GetCommand(string.Format("INSERT INTO {0} (SELECT * FROM {1})", tableName, tempTable), con))
                {
                    cmdBack.CommandTimeout = args.TimeoutInSeconds;
                    cmdBack.ExecuteNonQuery();
                }

                using (var cmdDropDistinctTable = server.GetCommand(string.Format("DROP TABLE {0}", tempTable), con))
                {
                    cmdDropDistinctTable.CommandTimeout = args.TimeoutInSeconds;
                    cmdDropDistinctTable.ExecuteNonQuery();
                }

                //if we opened a new transaction we should commit it
                if (args.TransactionIfAny == null)
                {
                    con.ManagedTransaction?.CommitAndCloseConnection();
                }
            }
        }
        public override void FillDataTableWithTopX(DatabaseOperationArgs args, DiscoveredTable table, int topX, DataTable dt)
        {
            using (var con = args.GetManagedConnection(table))
            {
                ((OracleConnection)con.Connection).PurgeStatementCache();

                var cols = table.DiscoverColumns();

                //apparently * doesn't fly with Oracle DataAdapter
                string sql = "SELECT " + string.Join(",", cols.Select(c => c.GetFullyQualifiedName()).ToArray()) + " FROM " + table.GetFullyQualifiedName() + " OFFSET 0 ROWS FETCH NEXT " + topX + " ROWS ONLY";

                using (var cmd = table.Database.Server.GetCommand(sql, con))
                    using (var da = table.Database.Server.GetDataAdapter(cmd))
                        args.Fill(da, cmd, dt);
            }
        }
Example #7
0
        public virtual DataTable GetDataTable(DatabaseOperationArgs args, int topX = int.MaxValue, bool enforceTypesAndNullness = true)
        {
            var dt = new DataTable();

            if (enforceTypesAndNullness)
            {
                foreach (DiscoveredColumn c in DiscoverColumns(args.TransactionIfAny))
                {
                    var col = dt.Columns.Add(c.GetRuntimeName());
                    col.AllowDBNull = c.AllowNulls;
                    col.DataType    = c.DataType.GetCSharpDataType();
                }
            }

            Helper.FillDataTableWithTopX(args, this, topX, dt);

            return(dt);
        }
        /// <inheritdoc/>
        public virtual DiscoveredRelationship AddForeignKey(DatabaseOperationArgs args, Dictionary <DiscoveredColumn, DiscoveredColumn> foreignKeyPairs, bool cascadeDeletes, string constraintName = null)
        {
            var foreignTables = foreignKeyPairs.Select(c => c.Key.Table).Distinct().ToArray();
            var primaryTables = foreignKeyPairs.Select(c => c.Value.Table).Distinct().ToArray();

            if (primaryTables.Length != 1 || foreignTables.Length != 1)
            {
                throw new ArgumentException("Primary and foreign keys must all belong to the same table", nameof(foreignKeyPairs));
            }


            var primary = primaryTables[0];
            var foreign = foreignTables[0];

            if (constraintName == null)
            {
                constraintName = primary.Database.Helper.GetForeignKeyConstraintNameFor(foreign, primary);
            }

            string constraintBit = primary.Database.Helper.GetForeignKeyConstraintSql(foreign.GetRuntimeName(), primary.GetQuerySyntaxHelper(),
                                                                                      foreignKeyPairs
                                                                                      .ToDictionary(k => (IHasRuntimeName)k.Key, v => v.Value), cascadeDeletes, constraintName);

            string sql = $@"ALTER TABLE {foreign.GetFullyQualifiedName()}
                ADD " + constraintBit;

            using (var con = args.GetManagedConnection(primary))
            {
                try
                {
                    using (var cmd = primary.Database.Server.GetCommand(sql, con))
                        args.ExecuteNonQuery(cmd);
                }
                catch (Exception e)
                {
                    throw new AlterFailedException("Failed to create relationship using SQL:" + sql, e);
                }
            }

            return(primary.DiscoverRelationships(args.TransactionIfAny).Single(
                       r => r.Name.Equals(constraintName, StringComparison.CurrentCultureIgnoreCase)
                       ));
        }
        public virtual void CreatePrimaryKey(DatabaseOperationArgs args, DiscoveredTable table, DiscoveredColumn[] discoverColumns)
        {
            var syntax = table.GetQuerySyntaxHelper();

            using (var connection = args.GetManagedConnection(table))
            {
                try{
                    string sql = string.Format("ALTER TABLE {0} ADD PRIMARY KEY ({1})",
                                               table.GetFullyQualifiedName(),
                                               string.Join(",", discoverColumns.Select(c => syntax.EnsureWrapped(c.GetRuntimeName())))
                                               );

                    using (DbCommand cmd = table.Database.Server.Helper.GetCommand(sql, connection.Connection, connection.Transaction))
                        args.ExecuteNonQuery(cmd);
                }
                catch (Exception e)
                {
                    throw new AlterFailedException(string.Format(FAnsiStrings.DiscoveredTableHelper_CreatePrimaryKey_Failed_to_create_primary_key_on_table__0__using_columns___1__, table, string.Join(",", discoverColumns.Select(c => c.GetRuntimeName()))), e);
                }
            }
        }
        public override void CreatePrimaryKey(DatabaseOperationArgs args, DiscoveredTable table, DiscoveredColumn[] discoverColumns)
        {
            try
            {
                using (var connection = args.GetManagedConnection(table))
                {
                    var columnHelper = GetColumnHelper();
                    foreach (var col in discoverColumns.Where(dc => dc.AllowNulls))
                    {
                        var alterSql = columnHelper.GetAlterColumnToSql(col, col.DataType.SQLType, false);
                        using (var alterCmd = table.GetCommand(alterSql, connection.Connection, connection.Transaction))
                            args.ExecuteNonQuery(alterCmd);
                    }
                }
            }
            catch (Exception e)
            {
                throw new AlterFailedException(string.Format(FAnsiStrings.DiscoveredTableHelper_CreatePrimaryKey_Failed_to_create_primary_key_on_table__0__using_columns___1__, table, string.Join(",", discoverColumns.Select(c => c.GetRuntimeName()))), e);
            }

            base.CreatePrimaryKey(args, table, discoverColumns);
        }
Example #11
0
 public DiscoveredRelationship AddForeignKey(DiscoveredColumn foreignKey, DiscoveredColumn primaryKey, bool cascadeDeletes, string constraintName = null, DatabaseOperationArgs args = null)
 {
     return(AddForeignKey(new Dictionary <DiscoveredColumn, DiscoveredColumn> {
         { foreignKey, primaryKey }
     }, cascadeDeletes, constraintName, args));
 }
Example #12
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="foreignKeyPairs">
 /// Key is the foreign key column (and the table the constraint will be put on).
 /// Value is the primary key table column (which the constraint reference points to)</param>
 /// <param name="cascadeDeletes"></param>
 /// <returns></returns>
 public DiscoveredRelationship AddForeignKey(Dictionary <DiscoveredColumn, DiscoveredColumn> foreignKeyPairs,
                                             bool cascadeDeletes, string constraintName = null, DatabaseOperationArgs args = null)
 {
     return(Helper.AddForeignKey(args ?? new DatabaseOperationArgs(), foreignKeyPairs, cascadeDeletes, constraintName));
 }
Example #13
0
 /// <summary>
 /// Deletes all EXACT duplicate rows from the table leaving only unique records.  This is method may not be transaction/threadsafe
 /// </summary>
 /// <param name="timeoutInSeconds">The length of time to allow for the command to complete (See <see cref="DbCommand.CommandTimeout"/>)</param>
 public void MakeDistinct(DatabaseOperationArgs args)
 {
     Helper.MakeDistinct(args, this);
 }
Example #14
0
 public void CreatePrimaryKey(DatabaseOperationArgs args, params DiscoveredColumn[] discoverColumns)
 {
     Helper.CreatePrimaryKey(args, this, discoverColumns);
 }
Example #15
0
 public void AddColumn(string name, string databaseType, bool allowNulls, DatabaseOperationArgs args)
 {
     Helper.AddColumn(args, this, name, databaseType, allowNulls);
 }
Example #16
0
 /// <summary>
 /// Creates and runs an ALTER TABLE SQL statement that adds a new column to the table
 /// </summary>
 /// <param name="name">The unqualified name for the new column e.g. "MyCol2"</param>
 /// <param name="type">The data type for the new column</param>
 /// <param name="allowNulls">True to allow null</param>
 public void AddColumn(string name, DatabaseTypeRequest type, bool allowNulls, DatabaseOperationArgs args)
 {
     AddColumn(name, Database.Server.GetQuerySyntaxHelper().TypeTranslater.GetSQLDBTypeForCSharpType(type), allowNulls, args);
 }
Example #17
0
 /// <summary>
 /// Returns true if there are no rows in the table
 /// </summary>
 /// <param name="transaction">Optional - if set the query will be sent on the connection on which the current <paramref name="transaction"/> is open</param>
 /// <returns></returns>
 public bool IsEmpty(DatabaseOperationArgs args)
 {
     return(Helper.IsEmpty(args, this));
 }
Example #18
0
 /// <summary>
 /// Returns the estimated number of rows in the table.  This may use a short cut e.g. consulting sys.partitions in Sql
 /// Server (https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-partitions-transact-sql?view=sql-server-2017)
 /// </summary>
 /// <param name="transaction">Optional - if set the query will be sent on the connection on which the current <paramref name="transaction"/> is open</param>
 /// <returns></returns>
 public int GetRowCount(DatabaseOperationArgs args)
 {
     return(Helper.GetRowCount(args, this));
 }
 public virtual bool IsEmpty(DatabaseOperationArgs args, DiscoveredTable discoveredTable)
 {
     return(GetRowCount(args, discoveredTable) == 0);
 }