Member 13269845 Ответов: 2

Поиск данных с 25 флажками и 21 текстовым полем не может получить соответствующие результаты при поиске как текста, так и флажков.


Я пытаюсь создать форму, которая обращается к Microsoft SQL Database Studio и позволяет пользователю добавлять, искать, обновлять и удалять записи. Однако у меня проблемы с флажками. Всякий раз, когда я выполняю поиск только по тексту и не имею ссылки на флажок в предложении where, я получаю правильные результаты с установленными флажками. Однако если я добавлю ссылку на флажок в предложении where, каждый поиск sql будет сосредоточен на части флажка, поэтому, если я введу что-нибудь в текстовые поля и не установлю флажки, я не получу результатов. Есть идеи, что я здесь делаю не так? Кроме того, даже без флажков в предложении where я возвращаю правильные результаты и флажки, но не без сообщения «запись не найдена» перед получением результатов.
private void btnSearch_Click(object sender, EventArgs e)
{


    con.Open();
    string str = "select * from engineering where (JobNumber like '%' + @search + '%' AND DateOrdered like '%' + @search1 + '%' AND Title like '%' + @search2 + '%' AND PhysicalAddressComplete like '%' + @search3 + '%' AND County like '%' + @search4 + '%' AND Client like '%' + @search5 + '%' AND Contact like '%' + @search6 + '%' AND ContactTitle like '%' + @search7 + '%' AND MailingAddressComplete like '%' + @search8 + '%' AND BusinessPhone like '%' + @search9 + '%' AND CellPhone like '%' + @search10 + '%' AND Email like '%' + @search11 + '%' AND OpenStatus like '%' + @search12 + '%' AND CloseStatus like '%' + @search13 + '%' AND Cabinet like '%' + @search14 + '%' AND Roll like '%' + @search15 + '%' AND Drawer like '%' + @search16 + '%' AND ConstructionDrawings like '%' + @search17 + '%' AND Fee like '%' + @search18 + '%' AND ConstructionCost like '%' + @search19 + '%' AND ProjectDescription like '%' + @search20 + '%' )";
    SqlCommand xp = new SqlCommand(str, con);
    xp.Parameters.Add("@search", SqlDbType.NVarChar).Value = txtProjectNumber.Text;
    xp.Parameters.Add("@search1", SqlDbType.NVarChar).Value = txtDateOrdered.Text;
    xp.Parameters.Add("@search2", SqlDbType.NVarChar).Value = txtProjectName.Text;
    xp.Parameters.Add("@search3", SqlDbType.NVarChar).Value = txtProjectAddress.Text;
    xp.Parameters.Add("@search4", SqlDbType.NVarChar).Value = txtCounty.Text;
    xp.Parameters.Add("@search5", SqlDbType.NVarChar).Value = txtClient.Text;
    xp.Parameters.Add("@search6", SqlDbType.NVarChar).Value = txtClientContact.Text;
    xp.Parameters.Add("@search7", SqlDbType.NVarChar).Value = txtContactTitle.Text;
    xp.Parameters.Add("@search8", SqlDbType.NVarChar).Value = txtBillingAddress.Text;
    xp.Parameters.Add("@search9", SqlDbType.NVarChar).Value = txtBusinessPhone.Text;
    xp.Parameters.Add("@search10", SqlDbType.NVarChar).Value = txtCellPhone.Text;
    xp.Parameters.Add("@search11", SqlDbType.NVarChar).Value = txtEmail.Text;
    xp.Parameters.Add("@search12", SqlDbType.NVarChar).Value = txtOpenStatus.Text;
    xp.Parameters.Add("@search13", SqlDbType.NVarChar).Value = txtCloseStatus.Text;
    xp.Parameters.Add("@search14", SqlDbType.NVarChar).Value = txtCabinet.Text;
    xp.Parameters.Add("@search15", SqlDbType.NVarChar).Value = txtRoll.Text;
    xp.Parameters.Add("@search16", SqlDbType.NVarChar).Value = txtDrawer.Text;
    xp.Parameters.Add("@search17", SqlDbType.NVarChar).Value = txtDrawings.Text;
    xp.Parameters.Add("@search18", SqlDbType.NVarChar).Value = txtFee.Text;
    xp.Parameters.Add("@search19", SqlDbType.NVarChar).Value = txtCost.Text;
    xp.Parameters.Add("@search20", SqlDbType.NVarChar).Value = txtProjectDescription.Text;
    xp.Parameters.AddWithValue("@DesignBuild", (chkDesign.Checked ? 1 : 0));

    try
    {


        da = new SqlDataAdapter();
        da.SelectCommand = xp;
        da.Fill(ss);


        Showdata(pos);
      if (ss.Rows.Count >0)
        {

            this.chkEducational.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Education"] == 1);
            this.chkDesign.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["DesignBuild"] == 1);
            this.chkMedical.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Medical"] == 1);
            this.chkReligious.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Religious"] == 1);
            this.chkMulti.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["MultiFamily"] == 1);
            this.chkStudent.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Student"] == 1);
            this.chkAssisted.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Assisted"] == 1);
            this.chkSingleFamily.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Single"] == 1);
            this.chkBridge.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Bridge"] == 1);
            this.chkIntersection.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Intersection"] == 1);
            this.chkRoadway.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Roadway"] == 1);
            this.chkTransOther.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["TransportationOther"] == 1);
            this.chkRetailSmall.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["SmallRetail"] == 1);
            this.chkRetailLarge.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["LargeRetail"] == 1);
            this.chkParks.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Parks"] == 1);
            this.chkIndustrial.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Industrial"] == 1);
            this.chkUtility.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Utility"] == 1);
            this.chkGCSmall.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["GCSmall"] == 1);
            this.chkGCLarge.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["GCLarge"] == 1);
            this.chkOffice.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Office"] == 1);
            this.chkOther.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Other"] == 1);
            this.chkMunicipal.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Municipal"] == 1);
            this.chkPrivate.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Privates"] == 1);
            this.chkInstitutional.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Institutional"] == 1);
            this.chkMilitary.Checked = ((int)ss.AsEnumerable().FirstOrDefault()["Military"] == 1);


        }

    }
    catch
    {
        MessageBox.Show("No Record Found");

    }


    con.Close();









}



Выше приведен код к моей кнопке поиска.То, как это делается выше, работает, по-видимому, хорошо, за исключением того, что я всегда получаю сообщение "Нет записи найдено", даже если результаты возвращаются. Однако как только я добавляю что-то вроде "AND DesignBuild = @DesignBuild" (это флажок) ,то все, что вводится в текстовые поля, игнорируется и всегда дает "никаких результатов".

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

Я пробовал несколько вариантов AND и OR в моих предложениях WHERE, но ничего не возвращается так, как я хочу. Я не знаю, есть ли ошибка только в моем SQL-операторе или нет. Любая помощь будет очень признательна.

0x01AA

Я предлагаю вам попробовать сначала с одним флажком и одним текстовым полем и ввести значения, для которых вы уверены, что получите результат. В случае успеха увеличьте не до 2, а до трех. После того, как это тоже будет успешно, вы сможете перейти к полному сценарию....
.. даже я думаю, что полный скэнароио-это безумие. Подумайте об этом, 25 флажков и 21 текстовое поле... пользователь вашего программного обеспечения должен обрабатывать очень много информации.

[Редактировать]
После облета вашего SQL, из того, что я знаю из Interbase SQL Server, ваш параметр должен быть @param, и вы должны присвоить ему значение '%xyz% ' и _not_, как вы это делаете '%'+@param+'%', что, скорее всего, также будет верно для mssql

Graeme_Grant

5+ ;)

an0ther1

Используйте SQL Profiler для захвата запроса, передаваемого в SQL ,и вставьте его в SQL Management Studio, а затем проверьте запрос.
Судя по вашему заявлению выше, параметр @DesignBuild не включен.
Кроме того, ваш обработчик исключений (catch) говорит: "записи не найдены". Это не обработчик исключений - обработчик исключений должен поймать ошибку и предоставить пользователю обратную связь о том, что произошло и почему.
с уважением

2 Ответов

Рейтинг:
2

S Douglas

Если я правильно понимаю ваши проблемы, ваш запрос работает так, как нужно, если у вас нет флажков в предложении where. Учитывая это, я вижу пару проблем.

1) предложение where отсутствует DesignBuild = ?

2) как память служит, ASP.NET рассматривая значения из флажков как "True" и "False", я бы предположил, что в таблице они определены как BIT или INT. Просто проблема с типом данных.

Надеюсь, это поможет.


Рейтинг:
2

Badal Kumar

Кажется, единственная проблема с вашим условием предложения where, просто попробуйте поставить условия, как указано ниже.

AND ((@search1 = null) OR (DateOrdered like '%' + @search1 + '%'))


Нужно указать каждое условие поиска таким образом, чтобы оператор игнорировал, если какое-то условие поиска не предусмотрено.