예제 #1
0
        public static void Merge(this SqlServerDestiny destiny)
        {
            var    keys = destiny.GetColumnKeys();
            string sql  = destiny.GetMergeCommand(keys);

            destiny.Connection.Execute(sql);
        }
예제 #2
0
        public static string GetMergeCommand(this SqlServerDestiny destiny, List <string> keys)
        {
            string sql = $" Merge {destiny.Table} as Destiny \n";

            sql += $" USING #{destiny.Table} as Origin \n";
            for (int i = 0; i < keys.Count; i++)
            {
                string key = keys[i];
                sql += $" {(i == 0 ? "ON" : "AND")} Destiny.[{key}] = Origin.[{key}] ";
                sql += "\n";
            }

            var columns             = destiny.GetColumns();
            var columnsWhithoutKeys = columns.Where(x => !keys.Any(y => y == x)).ToList();

            sql += $" WHEN MATCHED THEN \n";
            sql += $" UPDATE SET \n";
            for (int i = 0; i < columnsWhithoutKeys.Count; i++)
            {
                string column = columnsWhithoutKeys[i];
                sql += $" [{column}] = Origin.[{column}]";
                sql += (i < columnsWhithoutKeys.Count - 1) ? "," : "";
                sql += "\n";
            }

            sql += $" WHEN NOT MATCHED THEN \n";
            sql += $" INSERT ( { string.Join(", ", columns.Select(x => $"[{x}]"))} ) \n";
            sql += $" VALUES ( { string.Join(", ", columns.Select(x => $"Origin.[{x}]")) } ) \n";
            sql += ";";

            return(sql);
        }
예제 #3
0
        public static List <string> GetColumns(this SqlServerDestiny destiny)
        {
            string sql = $@"select COLUMN_NAME 
                            from INFORMATION_SCHEMA.COLUMNS 
                            where TABLE_NAME like '{destiny.Table}' ;";

            return(destiny.Connection.Query <string>(sql).ToList());
        }
예제 #4
0
        public static void CreateTemporaryTable(this SqlServerDestiny destiny)
        {
            string sql = $@"select top 0 *
                            into #{destiny.Table}
                            from {destiny.Table} ";

            destiny.Connection.Execute(sql);
        }
예제 #5
0
        public void DadoUmDestinoVálido()
        {
            ISqlServerDestiny destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            Assert.True(destiny.Valid);
        }
예제 #6
0
        public void DadoUmaConexãoInválidaRetornaUmaExcessão()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.InvalidaDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            Assert.Throws <System.Data.SqlClient.SqlException>(() => destiny.Load(data));
        }
예제 #7
0
        public void DadoUmDestinoVálidoEmUmaTabelaComUmaChavePrimariaComposta()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTableComDuasChaves);
            destiny.Validate();
            destiny.Load(data);
            Assert.True(destiny.Result.Success);
        }
예제 #8
0
        public SqlServerDestinyExtensionsTests()
        {
            destiny = new SqlServerDestiny();
            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);

            destinyComChavePrimariaComposta = new SqlServerDestiny();
            destinyComChavePrimariaComposta.SetConnection(Connections.LocalDataBase);
            destinyComChavePrimariaComposta.SetTable(SeedContext.ValidTableComDuasChaves);
        }
예제 #9
0
        public void DadoUmDestinoComConexãoNula()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(null);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            Assert.Equal("A string de conexão não pode ser vazio ou nula.",
                         destiny.Notifications.First());
        }
예제 #10
0
        public void DadoUmDestinoComUmaTabelaNula()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(null);
            destiny.Validate();
            Assert.Equal("A tabela de destino não pode ser vazio ou nulo.",
                         destiny.Notifications.First());
        }
예제 #11
0
        public void DadoUmDestinoVálidoEUmMapeamentoNuloExecutaASincronização()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            destiny.SetMapping(null);
            destiny.Load(data);
            Assert.True(destiny.Result.Success);
        }
예제 #12
0
        public void DadoUmDestinoVálidoFazASincronização()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            var result = destiny.Load(data);

            Assert.True(destiny.Result.Success);
        }
예제 #13
0
        public void DadoUmDestinoVálidoMasAFonteDeDadosÉNula()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            var result = destiny.Load(null);

            Assert.Equal("A fonte de dados para integração não pode ser nula.", destiny.Result.Message);
        }
예제 #14
0
        public void DadoUmDestinoVálidoEUmMapeamentoComPropriedadeNula()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);

            Assert.Throws <InvalidOperationException>(() => destiny.SetMapping(new List <Map>()
            {
                new Map(null, "Identidade"),
            }));
        }
예제 #15
0
        public void DadoUmDestinoVálidoEUmMapeamentoIncompletoMasCorretoExecutaASincronização()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            destiny.SetMapping(new List <Map>()
            {
                new Map("Identidade", "Identidade")
            });
            destiny.Load(data);
            Assert.True(destiny.Result.Success);
        }
예제 #16
0
        public void DadoUmDestinoVálidoMasMapeamentoIncorretoGeraUmExessão()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            destiny.SetMapping(new List <Map>()
            {
                new Map("x", "y"),
                new Map("x", "y"),
                new Map("x", "y")
            });

            Assert.Throws <InvalidOperationException>(() => destiny.Load(data));
        }
예제 #17
0
        public void DadoUmDestinoVálidoEUmMapeamentoComColunasAMaisExecutaASincronização()
        {
            var destiny = new SqlServerDestiny();

            destiny.SetConnection(Connections.LocalDataBase);
            destiny.SetTable(SeedContext.ValidTable);
            destiny.Validate();
            destiny.SetMapping(new List <Map>()
            {
                new Map("Identidade", "Identidade"),
                new Map("Sigla", "Sigla"),
                new Map("NomeDaRegiao", "NomeDaRegiao")
            });
            destiny.Load(data);
            Assert.True(destiny.Result.Success);
        }
예제 #18
0
        public void DadoUmaStringDeConexãoInválidaRetornaUmaExcessão()
        {
            var destiny = new SqlServerDestiny();

            Assert.Throws <ArgumentException>(() => destiny.SetConnection("XXXX"));
        }