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); }
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)); }