Beispiel #1
0
        public void Scan()
        {
            var values     = "@Foo, @Foo1, @Foo2, 'string', '@FooX', @Foo3, 100, '@Foo', 100.10";
            var parameters = SqlParameterScanner.Scan(values);

            Assert.AreEqual(4, parameters.Count);
            Assert.AreEqual("@Foo", parameters[0].Name);
            Assert.AreEqual("@Foo1", parameters[1].Name);
            Assert.AreEqual("@Foo2", parameters[2].Name);
            Assert.AreEqual("@Foo3", parameters[3].Name);
        }
Beispiel #2
0
        internal static List <string> GenerateMany <T>(string insert, string values, IList <T> list, int maxItens, int maxPacketSize)
        {
            if (string.IsNullOrWhiteSpace(insert))
            {
                throw new ArgumentNullException("insert can not be null or white space.");
            }

            if (string.IsNullOrWhiteSpace(values))
            {
                throw new ArgumentNullException("values can not be null or white space.");
            }

            if (list == null)
            {
                throw new ArgumentNullException("list can not be null.");
            }

            if (maxItens <= 0)
            {
                throw new ArgumentException("maxItens can not be less or equal 0");
            }

            if (maxPacketSize <= 0)
            {
                throw new ArgumentException("maxPacketSize can not be less or equal 0");
            }

            if (values[0] == '(')
            {
                values = values.Remove(0, 1);
            }

            if (values[values.Length - 1] == ')')
            {
                values = values.Remove(values.Length - 1, 1);
            }

            var type          = typeof(T);
            var sqlParameters = SqlParameterScanner.Scan(values); //<TODO> gerar arvore sintática e gerar comando com string.Join
            var converter     = SqlTypeConverter.GetInstance();
            var listValues    = new List <string>();

            foreach (var sqlParameter in sqlParameters)
            {
                var parameterName = sqlParameter.GetParameterName();
                var property      = type.GetProperty(parameterName);

                if (property == null)
                {
                    throw new InvalidSqlParameterException($"Property '{parameterName}' does not exist in type {type.Name}.");
                }
            }

            for (int listIndex = 0; listIndex < list.Count; listIndex++)
            {
                var sql      = values;
                var item     = list[listIndex];
                var addIndex = 0;

                for (int propertyIndex = 0; propertyIndex < sqlParameters.Count; propertyIndex++)
                {
                    var parameter     = sqlParameters[propertyIndex];
                    var parameterName = parameter.GetParameterName();
                    var property      = type.GetProperty(parameterName);
                    var value         = converter.GetValue(item, property);
                    var dif           = (value.Length - parameter.Name.Length);

                    sql = sql.Remove(parameter.StartIndex + addIndex, parameter.Name.Length);
                    sql = sql.Insert(parameter.StartIndex + addIndex, value);

                    addIndex += dif;
                }

                listValues.Add($"({sql})");
            }

            return(GenerateMany(insert, listValues, maxItens, maxPacketSize));
        }