el_tot93 Ответов: 3

Текстовое поле множественного поиска C# (ошибка)


Дорогой:
друзья

пожалуйста, если у вас есть время, чтобы решить мою проблему
у меня есть много текстовых полей в моей форме с одной кнопкой и одним datagridview
я использую этот код для выполнения поиска
<pre>DataTable dt = new DataTable();

            
            if (txtCIVILIDD.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from Tabl1 where  CIVILIDD = '" + txtCIVILIDD.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (txtName_Arabic.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where Name_Arabic like '%" + txtName_Arabic.Text + "%'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (txtusername.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from Tabl1 where  username = '" + txtusername.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (comboBox1.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where status = '" + comboBox1.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (comboBox2.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where confirmation = '" + comboBox2.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (CBgender.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where gender like '%" + CBgender.Text + "%'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (CBNATIONALITY.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where NATIONALITY like '" + CBNATIONALITY.Text + "%'", con);
                sda.Fill(dt);
                con.Close();
            }
            else if (comboBoxGovernorate.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where Governorate = '" + comboBoxGovernorate.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();

            }
            else if (comboBoxCity.Text.Length > 0)
            {
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter("select * from tabl1 where City = '" + comboBoxCity.Text.Trim() + "'", con);
                sda.Fill(dt);
                con.Close();
            }
            dataGridView1.DataSource = dt;
        }


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

Что делать, если я хочу выполнить поиск, используя значения из 2 или более текстовых полей. что делать, если я наберу "r" в текстовом поле имя, а затем также наберу "NY" в текстовом поле город? Я хочу увидеть, как gridview выдаст мне результаты этого.

вот что я пытаюсь найти и ничего не нашел

код работает, если я ищу только в одном текстовом поле

с наилучшими пожеланиями

3 Ответов

Рейтинг:
5

el_tot93

я получаю решение с помощью этого кода я надеюсь что это поможет кому нибудь


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

private void button2_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("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["myDatabase"].ConnectionString))
    {
        selectCommand.Connection = connection;
        selectCommand.CommandText = filterCondition == null ? "SELECT * FROM tabl1" : "SELECT * FROM tabl1 WHERE " + filterCondition;
        connection.Open();
        SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);
        DataTable dataSource = new DataTable();
        adapter.Fill(dataSource);
        dataGridView1.DataSource = dataSource;
    }
}


Рейтинг:
0

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Кроме того, это случай создания соответствующего запроса:
string select = "SELECT * FROM Tabl1 WHERE Name_Arabic LIKE '%' + @NM + '%' AND City LIKE '%' + @CT + '%'";
Построить его с помощью StringBuilder, чтобы и условия, а также основываясь на том, что текстовые поля имеют содержание.


Рейтинг:
0

Richard MacCutchan

Сначала вам нужно проверить все текстовые поля. Соберите текстовые записи и создайте инструкцию поиска, объединив значения в соответствии с соответствующими полями в базе данных. Например, вы можете сделать что-то вроде:

StringBuilder sqlcommand = "SELECT * FROM tabl1 WHERE ";
if (!string.IsNullOrEmpty(CBgender.Text))
{
    sqlcommand.Append("GENDER LIKE '%");
    sqlcommand.Append(CBgender.Text);
    sqlcommand.Append("%'");
}
// repeat for other textbox fields

Когда все поля будут проверены, вы отправите команду.

[редактировать]
И как справедливо указывает OriginalGriff (и я должен был бы): всегда используйте параметризованные запросы.
[/редактировать]


Kraule

Небольшое изменение в решении 2:

StringBuilder sqlcommand = "SELECT * FROM tabl1 WHERE 1=1 ";
если (!строка.IsNullOrEmpty(CBgender.Text))
{
sqlcommand.Append(" и пол как '%");
sqlcommand.Добавить(CBgender.Text);
sqlcommand.Добавлять("%'");
}
// повторите для других полей текстового поля

Richard MacCutchan

Или вы можете просто добавить предложение where в первое непустое поле. Начните со строки, содержащей "WHERE", и когда вы добавите ее, измените ее на " ".

el_tot93

почему он дал мне ошибку в "SELECT * FROM tabl1 WHERE 1=1 "

Richard MacCutchan

Понятия не имею, какая ошибка?

el_tot93

это дало мне красную линию под "SELECT * FROM tabl1 WHERE 1=1 "; ???????