Amar chand123 Ответов: 2

Проблема при поиске данных из базы данных в C# winform


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

private DataTable PopulateDataGridView()
        {
            
                string query = "SELECT Number, CustomerName, MobileNo, SecMobileNo FROM customer";
                query += " WHERE Number LIKE '%' + @SearchTerm + '%'";
                query += " OR CustomerName LIKE '%' + @SearchTerm + '%'";
                query += " OR MobileNo LIKE '%' + @SearchTerm + '%'";
                query += " OR SecMobileNo LIKE '%' + @SearchTerm + '%'";
                query += " OR @SearchTerm = ''";
                string constr = ConfigurationManager.ConnectionStrings["TestData"].ConnectionString;
                using (OleDbConnection con = new OleDbConnection(constr))
                {
                    using (OleDbCommand cmd = new OleDbCommand(query, con))
                    {
                        cmd.Parameters.AddWithValue("@SearchTerm", txtName.Text.Trim());
                        using (OleDbDataAdapter sda = new OleDbDataAdapter(cmd))
                        {
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            return dt;
                        }
                    }
                }
            }



но когда я пытаюсь в моем datatable показать и искать только те данные, значение столбцов состояния которых "открыто", но мой код не работает, и данные отображаются так же, как мой выше/старый код без какого-либо фильтра

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

private DataTable PopulateDataGridView()
        {
            string query = "SELECT Number, CustomerName, MobileNo, SecMobileNo, Status FROM customer";
                query += " WHERE Number LIKE '%' + @SearchTerm + '%'";
                query += " OR CustomerName LIKE '%' + @SearchTerm + '%'";
                query += " OR MobileNo LIKE '%' + @SearchTerm + '%'";
                query += " OR SecMobileNo LIKE '%' + @SearchTerm + '%'";
                query += " OR @SearchTerm = ''";
                query += "AND Status=@Status";
                string constr = ConfigurationManager.ConnectionStrings["TestData"].ConnectionString;
                using (OleDbConnection con = new OleDbConnection(constr))
                {
                    using (OleDbCommand cmd = new OleDbCommand(query, con))
                    {
                        cmd.Parameters.AddWithValue("@SearchTerm", txtName.Text.Trim());
                        cmd.Parameters.AddWithValue("@Status", "OPEN");
                        using (OleDbDataAdapter sda = new OleDbDataAdapter(cmd))
                        {
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            return dt;
                        }
                    }
                }
        }

ZurdoDev

Вы должны это отладить. Что ты хочешь, чтобы мы сделали?

2 Ответов

Рейтинг:
17

Richard Deeming

Ваш запрос:

WHERE 
    Number LIKE ...
OR 
    CustomerName LIKE ...
OR 
    MobileNo LIKE ...
OR 
    SecMobileNo LIKE ...
OR 
    @SearchTerm = ''
AND 
    Status = @Status
Добавление круглых скобок в соответствии с неявным приоритет операторов[^] дает:
WHERE 
    Number LIKE ...
OR 
    CustomerName LIKE ...
OR 
    MobileNo LIKE ...
OR 
    SecMobileNo LIKE ...
OR 
(
    @SearchTerm = ''
AND 
    Status = @Status
)
Другими словами, если Number, CustomerName, MobileNo, или SecMobileNo матч, запись будет включена несмотря на из Status.

Чтобы переопределить приоритет оператора, вам нужно будет явно добавить круглые скобки к вашему запросу:
WHERE 
(
    Number LIKE ...
OR 
    CustomerName LIKE ...
OR 
    MobileNo LIKE ...
OR 
    SecMobileNo LIKE ...
OR 
    @SearchTerm = ''
)
AND 
    Status = @Status
В коде:
string query = "SELECT Number, CustomerName, MobileNo, SecMobileNo, Status FROM customer";
query += " WHERE (Number LIKE '%' + @SearchTerm + '%'";
query += " OR CustomerName LIKE '%' + @SearchTerm + '%'";
query += " OR MobileNo LIKE '%' + @SearchTerm + '%'";
query += " OR SecMobileNo LIKE '%' + @SearchTerm + '%'";
query += " OR @SearchTerm = '')";
query += "AND Status = @Status";
NB: Возможно, Вам будет легче увидеть запрос, если вы используете дословная строка[^]:
const string query = @"SELECT 
    Number, 
    CustomerName, 
    MobileNo, 
    SecMobileNo, 
    Status 
FROM 
    customer
WHERE
(
    Number LIKE '%' + @SearchTerm + '%'
Or
    CustomerName LIKE '%' + @SearchTerm + '%'
Or
    MobileNo LIKE '%' + @SearchTerm + '%'
Or
    SecMobileNo LIKE '%' + @SearchTerm + '%'
Or
    @SearchTerm = ''
)
And
    Status = @Status
";


Amar chand123

Спасибо сэр Ричард Диминг, сэр, не могли бы вы предложить мне, где я изучаю синтаксис SQL онлайн, потому что я только начал изучать программирование из интернета

Richard Deeming

Прошло много времени с тех пор, как я начал, так что я больше не знаю, что такое лучшие ресурсы. :)

Этот, похоже, может помочь:
SQL Tutorial - идеальное руководство для начинающих[^]

Рейтинг:
1

Richard MacCutchan

query += " OR @SearchTerm = ''";
query += "AND Status=@Status";

Вам не хватает пробела между двумя кавычками ('') в первой из вышеприведенных строк, а также в AND во втором.


Amar chand123

Я стараюсь, но все равно не получается

Amar chand123

и если я использую этот код, то данные показывают другие, чем "открытые", но там, где статус "открытые" данные не отображаются

строка запроса = "выбрать количество, CustomerName, MobileNo, SecMobileNo, информация от клиента, где статус=@статус ";
запрос += " или число типа '%' + @SearchTerm + '%'";
query += " или CustomerName типа '%' + @SearchTerm + '%'";
запрос += " или MobileNo типа '%' + @SearchTerm + '%'";
запрос += " или SecMobileNo как '%' + @SearchTerm + '%'";
запрос += "или @SearchTerm =' '";

string constr = ConfigurationManager.ConnectionStrings["TestData"].Параметр connectionString;
используя (метод oledbconnection кон = новый объект oledbconnection(обл))
{
используя (объект oledbcommand команду cmd = новый объект oledbcommand(запрос, кон))
{
cmd.параметры.AddWithValue("@SearchTerm", txtName.Text.Trim());
cmd.параметры.AddWithValue("@Status", "OPEN");
используя (объект oledbdataadapter ПДД = новый объект oledbdataadapter(УМК))
{

DataTable dt = новый DataTable();
ПДД.Заполнить(ДТ);
возврат dt;
}
}
}

Richard MacCutchan

Ваш код проверяет, равен ли статус "открыто", ОПЕРАЦИОННАЯ если любое из других условий истинно. Попробуйте простой тест с одним поисковым термином и одним статусом, чтобы получить правильный синтаксис. И, пожалуйста, внимательно прочитайте то, что вы закодировали.