Поиск данных с 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) говорит: "записи не найдены". Это не обработчик исключений - обработчик исключений должен поймать ошибку и предоставить пользователю обратную связь о том, что произошло и почему.
с уважением