el_tot93 Ответов: 2

У меня есть проблема с фильтром данных между 2 текстовыми полями


теперь я использую код thx чтобы сделать фильтр в datagridview я хочу добавить 2 текстовых поля чтобы сделать фильтр между возрастом например между 20 и 30 как я могу это сделать я пробую muny вещь но она не работает со мной


private void Button1_Click(object sender, EventArgs e)
        {
            SqlCommand selectCommand = new SqlCommand();

            var filterConditions = new[] {
        CreateSqlFilter("Name_Arabic", txtName_Arabic, selectCommand, false),
        CreateSqlFilter("gender", CBgender, selectCommand, false),
        CreateSqlFilter("CIVILIDD", txtCIVILIDD, selectCommand, true),
        CreateSqlFilter("status", comboBox1, selectCommand, false),
        CreateSqlFilter("username", txtusername, selectCommand, false),
        CreateSqlFilter("City", comboBoxCity, selectCommand, false),
        CreateSqlFilter("Governorate", comboBoxGovernorate, selectCommand, false),
        CreateSqlFilter("confirmation", comboBox2, selectCommand, false),
        CreateSqlFilter("NATIONALITY", CBNATIONALITY, selectCommand, false)
        // etc.
    };

            string filterCondition = filterConditions.Any(a => a != null) ? filterConditions.Where(a => a != null).Aggregate((filter1, filter2) => String.Format("{0} AND {1}", filter1, filter2)) : (string)null;

            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["my"].ConnectionString))
            {
                selectCommand.Connection = connection;
                selectCommand.CommandText = filterCondition == null ? "SELECT * FROM tabl2" : "SELECT * FROM tabl2 WHERE " + filterCondition;
                connection.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
                DataTable dataSource = new DataTable();
                adapter.Fill(dataSource);
                dataGridView1.DataSource = dataSource;
            }
        }

        private string CreateSqlFilter(string fieldName, Control userInputControl, SqlCommand command, bool exactMatch)
        {
            string searchValue = null;
            if (userInputControl is TextBox) searchValue = ((TextBox)userInputControl).Text;
            if (userInputControl is ComboBox) searchValue = ((ComboBox)userInputControl).Text;
            if (String.IsNullOrWhiteSpace(searchValue)) return null;

            if (exactMatch)
            {
                command.Parameters.Add(new SqlParameter("@" + fieldName, searchValue));
                return fieldName + " = @" + fieldName;
            }
            else
            {
                command.Parameters.Add(new SqlParameter("@" + fieldName, "%" + searchValue + "%"));
                return fieldName + " LIKE @" + fieldName;
            }
        }


Что я уже пробовал:

Послушайте я пробую это и это хорошо работает о том что я хочу я хочу объединить его с моим кодом frist чтобы заставить его работать в одной кнопке

SqlConnection con = new SqlConnection("Data Source=DESKTOP-J7D5POF;Initial Catalog=ilswork;Persist Security Info=True;User ID=****;Password=*****;connect timeout=900");
           SqlDataAdapter sdf = new SqlDataAdapter("select * from tabl2 where age between'" + txt1.text + "'and'" + txt2.text + "'", con);
           DataTable sd = new DataTable();
           sdf.Fill(sd);
           dataGridView1.DataSource = sd;

2 Ответов

Рейтинг:
2

OriginalGriff

Только не это! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Maciej Los

5ed!

Рейтинг:
2

Maciej Los

Цитата:
фильтр между возрастом например между 20 и 30 как я могу это сделать я пробую Муни вещь но она не работает со мной


Взгляните на свою команду sql:
select * from tabl2 where age between'" + txt1.text + "'and'" + txt2.text + "'"

Представьте себе, когда вы передадите в него значения, он примет форму:
select * from tabl2 where age between'20'and'30'"


Я вижу 2 проблемы:
1. там нет пространства между ценностями и частях, где заявление:
between[here]'20'[here]and[here]'30'

2. переданные значения не соответствуют исходному типу данных!
Один [20] (целочисленное значение) не равно a ['20'] (строковое значение)!

OriginalGriff уже указал вам, как это исправить!


el_tot93

сэр код работает но я хочу объединить его с моим фрист кодом

Maciej Los

- Вы уверены? Вы упомянули ранее, что это не работа.

el_tot93

нет я не говорил что проблема тут в слиянии наперстков

Maciej Los

Слияние чего?
Я тебя не понимаю...

el_tot93

посмотри на мой первый код, который это сделает фильтр в datagridview я хочу добавить в команду, код saceand первого

el_tot93

я говорю, что пробую второй код, и он работает

Maciej Los

Пожалуйста, прочтите это: SelectQueryBuilder: построение сложных и гибких SQL-запросов/команд из языка C#[^]
Это правильный путь, чтобы построить комплекс, где команды с заявлениями. Не единственный, но один из способов добиться этого.