private DbCommand CreateBulkDeleteCommand(DbConnection connection, DbTransaction transaction)
        {
            var procName = this.SqlObjectNames.GetStoredProcedureCommandName(DbStoredProcedureType.BulkDeleteRows);

            StringBuilder stringBuilder = new StringBuilder(string.Concat("CREATE PROCEDURE ", procName));

            string str = "\n\t";

            var sqlParameterChangeTable = new SqlParameter("@changeTable", SqlDbType.Structured)
            {
                TypeName = this.SqlObjectNames.GetStoredProcedureCommandName(DbStoredProcedureType.BulkTableType)
            };

            stringBuilder.Append(string.Concat(str, SqlBuilderProcedure.CreateParameterDeclaration(sqlParameterChangeTable)));

            stringBuilder.Append("\nAS\nBEGIN\n");

            string joins = SqlManagementUtils.JoinTwoTablesOnClause(this.TableDescription.PrimaryKeys, "[changes]", "[base]");

            stringBuilder.AppendLine($"DELETE {this.TableName.Schema().Quoted()}");
            stringBuilder.AppendLine($"FROM {this.TableName.Quoted()} [base]");
            stringBuilder.AppendLine($"JOIN @changeTable as [changes] ON {joins}");

            stringBuilder.AppendLine("END");

            var sqlCommand = new SqlCommand(stringBuilder.ToString(), (SqlConnection)connection, (SqlTransaction)transaction);

            return(sqlCommand);
        }
Ejemplo n.º 2
0
 public SqlTableBuilder(SyncTable tableDescription, ParserName tableName, ParserName trackingTableName, SyncSetup setup) : base(tableDescription, tableName, trackingTableName, setup)
 {
     this.sqlBuilderProcedure     = new SqlBuilderProcedure(tableDescription, tableName, trackingTableName, Setup);
     this.sqlBuilderTable         = new SqlBuilderTable(tableDescription, tableName, trackingTableName, Setup);
     this.sqlBuilderTrackingTable = new SqlBuilderTrackingTable(tableDescription, tableName, trackingTableName, Setup);
     this.sqlBuilderTrigger       = new SqlBuilderTrigger(tableDescription, tableName, trackingTableName, Setup);
 }
Ejemplo n.º 3
0
        public SqlTableBuilder(SyncTable tableDescription, ParserName tableName, ParserName trackingTableName, SyncSetup setup, string scopeName)
            : base(tableDescription, tableName, trackingTableName, setup, scopeName)
        {
            this.SqlObjectNames = new SqlObjectNames(tableDescription, tableName, trackingTableName, setup, scopeName);
            this.SqlDbMetadata  = new SqlDbMetadata();

            this.sqlBuilderProcedure     = new SqlBuilderProcedure(tableDescription, tableName, trackingTableName, Setup, scopeName);
            this.sqlBuilderTable         = new SqlBuilderTable(tableDescription, tableName, trackingTableName, Setup);
            this.sqlBuilderTrackingTable = new SqlBuilderTrackingTable(tableDescription, tableName, trackingTableName, Setup);
            this.sqlBuilderTrigger       = new SqlBuilderTrigger(tableDescription, tableName, trackingTableName, Setup, scopeName);
        }
        private DbCommand CreateResetCommand(DbConnection connection, DbTransaction transaction)
        {
            var           procName      = this.SqlObjectNames.GetStoredProcedureCommandName(DbStoredProcedureType.Reset);
            StringBuilder stringBuilder = new StringBuilder(string.Concat("CREATE PROCEDURE ", procName));

            SqlParameter sqlParameter = new SqlParameter("@sync_row_count", SqlDbType.Int)
            {
                Direction = ParameterDirection.Output
            };
            string str = "\n\t";

            stringBuilder.Append(string.Concat(str, SqlBuilderProcedure.CreateParameterDeclaration(sqlParameter)));

            stringBuilder.Append("\nAS\nBEGIN\n");
            stringBuilder.AppendLine($"DELETE FROM {this.TableName.Schema().Quoted().ToString()};");
            stringBuilder.AppendLine(string.Concat("SET ", sqlParameter.ParameterName, " = @@ROWCOUNT;"));
            stringBuilder.AppendLine("END");

            var sqlCommand = new SqlCommand(stringBuilder.ToString(), (SqlConnection)connection, (SqlTransaction)transaction);

            return(sqlCommand);
        }
        private DbCommand CreateBulkUpdateCommand(DbConnection connection, DbTransaction transaction)
        {
            var procName = this.SqlObjectNames.GetStoredProcedureCommandName(DbStoredProcedureType.BulkUpdateRows);

            StringBuilder stringBuilder = new StringBuilder(string.Concat("CREATE PROCEDURE ", procName));
            string        str           = "\n\t";

            var sqlParameterChangeTable = new SqlParameter("@changeTable", SqlDbType.Structured)
            {
                TypeName = this.SqlObjectNames.GetStoredProcedureCommandName(DbStoredProcedureType.BulkTableType)
            };

            stringBuilder.Append(string.Concat(str, SqlBuilderProcedure.CreateParameterDeclaration(sqlParameterChangeTable)));

            stringBuilder.Append("\nAS\nBEGIN\n");

            var    stringBuilderArguments  = new StringBuilder();
            var    stringBuilderParameters = new StringBuilder();
            string empty = string.Empty;

            string str4 = SqlManagementUtils.JoinTwoTablesOnClause(this.TableDescription.PrimaryKeys, "[p]", "[t]");
            string str5 = SqlManagementUtils.JoinTwoTablesOnClause(this.TableDescription.PrimaryKeys, "[changes]", "[base]");
            string str6 = SqlManagementUtils.JoinTwoTablesOnClause(this.TableDescription.PrimaryKeys, "[t]", "[side]");
            string str7 = SqlManagementUtils.JoinTwoTablesOnClause(this.TableDescription.PrimaryKeys, "[p]", "[side]");


            // Check if we have auto inc column
            if (this.TableDescription.HasAutoIncrementColumns)
            {
                stringBuilder.AppendLine();
                stringBuilder.AppendLine($"SET IDENTITY_INSERT {this.TableName.Schema().Quoted().ToString()} ON;");
                stringBuilder.AppendLine();
            }

            stringBuilder.AppendLine($"MERGE {this.TableName.Schema().Quoted().ToString()} AS [base]");
            stringBuilder.AppendLine($"USING @changeTable as [changes] on {str5}");

            var hasMutableColumns = this.TableDescription.GetMutableColumns(false).Any();

            if (hasMutableColumns)
            {
                stringBuilder.AppendLine("WHEN MATCHED THEN");
                foreach (var mutableColumn in this.TableDescription.Columns.Where(c => !c.IsReadOnly))
                {
                    var columnName = ParserName.Parse(mutableColumn).Quoted().ToString();
                    stringBuilderArguments.Append(string.Concat(empty, columnName));
                    stringBuilderParameters.Append(string.Concat(empty, $"changes.{columnName}"));
                    empty = ", ";
                }
                stringBuilder.AppendLine();
                stringBuilder.AppendLine($"\tUPDATE SET");

                string strSeparator = "";
                foreach (var mutableColumn in this.TableDescription.GetMutableColumns(false))
                {
                    var columnName = ParserName.Parse(mutableColumn).Quoted().ToString();
                    stringBuilder.AppendLine($"\t{strSeparator}{columnName} = [changes].{columnName}");
                    strSeparator = ", ";
                }
            }

            stringBuilder.AppendLine("WHEN NOT MATCHED BY TARGET THEN");

            stringBuilderArguments  = new StringBuilder();
            stringBuilderParameters = new StringBuilder();
            empty = string.Empty;

            foreach (var mutableColumn in this.TableDescription.Columns.Where(c => !c.IsReadOnly))
            {
                var columnName = ParserName.Parse(mutableColumn).Quoted().ToString();

                stringBuilderArguments.Append(string.Concat(empty, columnName));
                stringBuilderParameters.Append(string.Concat(empty, $"[changes].{columnName}"));
                empty = ", ";
            }
            stringBuilder.AppendLine();
            stringBuilder.AppendLine($"\tINSERT");
            stringBuilder.AppendLine($"\t({stringBuilderArguments.ToString()})");
            stringBuilder.AppendLine($"\tVALUES ({stringBuilderParameters.ToString()});");

            // Check if we have auto inc column
            if (this.TableDescription.HasAutoIncrementColumns)
            {
                stringBuilder.AppendLine();
                stringBuilder.AppendLine($"SET IDENTITY_INSERT {this.TableName.Schema().Quoted().ToString()} ON;");
                stringBuilder.AppendLine();
            }

            stringBuilder.Append("\nEND");

            var command = new SqlCommand(stringBuilder.ToString(), (SqlConnection)connection, (SqlTransaction)transaction);

            return(command);
        }