|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Добрый день! Возникла следующая проблема. У меня есть БД, в которой есть таблица. Как осуществить средством Microsoft Visual Studio 2012 (язык программирования VB.net) возможность выборки по нескольким столбцам записей, содержащих нужную мне информацию (информация отличается в разных полях)? Загвоздка в том, чтобы была еще реализована одновременно и выборка по одному из параметров, если остальные параметры пустые. Ниже скрин формы для отбора. Заранее спасибо! Модератор: Тема перенесена из форума "Visual Basic". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.11.2013, 13:31 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2013, 18:23 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Alex Kuznetsov, С выборкой у меня проблем нет. Я не могу сформировать ее по нескольким параметрам, чтобы была допущена такая ситуация, что один из параметров может отсутствовать. Например (исходя из предоставленной мной формы), если я выбираю "статус заявки" и "СЦ", то о мне ищет по этим критериям, а если указан "статус заявки" и больше ничего, то только по статусу ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 12:21 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 12:37 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
а как проще все это в коде VB реализовать? Все на if и elseif сажать не получается. Слишком много операторов и он начинает выдавать белеберду. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 12:48 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
chezzz, не надо здесь if и elseif. Пишешь запрос один на все случаи, потом просто добавляешь параметры к нему (sql.Parameteres.AddWithValue()) - значение, если пользователь выбрал параметр, и DbNull.Value, если не выбрал ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 12:51 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
chezzzAlex Kuznetsov, С выборкой у меня проблем нет. Я не могу сформировать ее по нескольким параметрам, чтобы была допущена такая ситуация, что один из параметров может отсутствовать. Например (исходя из предоставленной мной формы), если я выбираю "статус заявки" и "СЦ", то о мне ищет по этим критериям, а если указан "статус заявки" и больше ничего, то только по статусуА из какого такого места Вашего вопроса понятно, что Вы можете делать выборки? Где указан сервер БД и его версия? Где указан сам текст запроса? Где кусок кода, в котором указываются параметры? Отсюда - каков вопрос, таков ответ. Pallaris - для разных серверов БД запросы могут быть разными в данном случае, но подход у тебя правильный. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:00 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Alex Kuznetsovдля разных серверов БД запросы могут быть разными в данном случае Я не думаю, что это наш случай :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:02 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Pallaris, ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:10 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My.Application.Info.DirectoryPath & "\Service.accdb") ' Переменная для подключения базы Dim SqlCom As OleDb.OleDbCommand ' Переменная для Sql запросов Dim DT As New Data.DataTable ' Таблица для хранения результатов запроса Dim DA As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса Sub LoadAll() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Request]", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub LoadAll_74() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE (Склад = 74)", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub LoadAll_pre_trading() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE (Клиент = 'Медиа Маркт' and Склад <> 74)", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub LoadAll_sale() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE (Клиент <> 'Медиа Маркт')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub LoadAll_3() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE (Склад = 3)", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub LoadAll_client() 'Процедура чтения всей таблицы из базы DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE (Склад = 0)", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End Sub Sub checked() If CheckBox4.Checked = True And CheckBox1.Checked = False And CheckBox2.Checked = False And CheckBox3.Checked = False Then LoadAll_74() ElseIf CheckBox1.Checked = True And CheckBox2.Checked = True And CheckBox3.Checked = False And CheckBox4.Checked = False Then LoadAll_3() ElseIf CheckBox2.Checked = True And CheckBox1.Checked = False And CheckBox3.Checked = False And CheckBox4.Checked = False Then LoadAll_pre_trading() ElseIf CheckBox1.Checked = True And CheckBox2.Checked = False And CheckBox3.Checked = False And CheckBox4.Checked = False Then LoadAll_sale() ElseIf CheckBox3.Checked = True And CheckBox1.Checked = False And CheckBox2.Checked = False And CheckBox4.Checked = False Then LoadAll_client() End If End Sub Sub value() If TextBox1.Text <> "" Then DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE ([№ заявки] = '" + TextBox1.Text + "')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End If If TextBox2.Text <> "" Then DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE ([№ артикула] = '" + TextBox2.Text + "')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End If If ComboBox1.SelectedValue IsNot "" Then DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE ([Статус заявки] = '" + ComboBox1.SelectedValue + "')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение ElseIf ComboBox2.SelectedValue IsNot "" Then DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE ([Производитель] = '" + ComboBox2.SelectedValue + "')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение ElseIf ComboBox3.SelectedValue IsNot "" Then DT.Clear() 'Очищаем таблицу SqlCom = New OleDb.OleDbCommand("SELECT * FROM Request WHERE ([СЦ] = '" + ComboBox3.SelectedValue + "')", Con) ' Указываем строку запроса и привязываем к соединению Con.Open() ' Открываем соединение SqlCom.ExecuteNonQuery() 'Выполняем запрос DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса DA.Fill(DT) ' Заполняем таблицу результатми Me.DataGridView1.DataSource = DT ' Привязываем Грид к источнику данных Con.Close() ' Закрываем соединение End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click checked() value() If TextBox1.Text = "" And TextBox2.Text = "" And ComboBox1.SelectedValue Is "" And ComboBox2.SelectedValue Is "" And ComboBox3.SelectedValue Is "" And CheckBox1.Checked = False And CheckBox2.Checked = False And CheckBox3.Checked = False And CheckBox4.Checked = False Then LoadAll() End If End Sub ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:31 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Что это за месево гавнокода? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:34 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Мой понедельник задался :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:36 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
МСУ, да, месево. И из этого месева мне предложили сделать конфетку, так еще и чтобы работало, так как пожелают ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:37 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
посты тэгом src научись оформлять ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:42 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:45 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
так лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:45 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
ну а сам-то как думаешь? Правда, все равно лень читать, все нужные советы тебе уже дали ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:47 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Pallaris Код: c# 1.
Такие варианты очень больно бьют по производительности запроса, добавляя ненужные конкатенации в плане исполнения. Надо просто динамически формировать текст запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 13:58 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныPallaris Код: c# 1.
Такие варианты очень больно бьют по производительности запроса, добавляя ненужные конкатенации в плане исполнения. Надо просто динамически формировать текст запроса. Все правда, но в большинстве случаев такой вариант вполне приемлем. Если учесть, что в форуме Delphi меня серьезно убеждали, что открыть транзакцию и ждать окончания пользовательского ввода - это нормально, то на этом фоне падение производительности заметно не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 14:15 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныТакие варианты очень больно бьют по производительности запроса, добавляя ненужные конкатенации в плане исполнения. Надо просто динамически формировать текст запроса. Ну если будет работать медленно - тогда да, надо что-то решать. Но я думаю, планировщик с конструкцией where (null is null or ...) должен нормально справиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 14:49 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
chezzzтак лучше?Шедеврально... Автора говнокода на кол... Всё делается ОДНИМ запросом с динамическим формированием выражения WHERE, либо использованием параметров в сравнении их с NULL... И к тому-же вот это меня сильно удивило и заставило призадуматься... Код: c# 1. 2. 3. 4.
PS. Херасе, и не лень же кому-то было копипастить столько г0внища... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 14:56 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Pallaris Код: c# 1.
Так быстрее работает Код: c# 1.
http://www.sql.ru/faq/faq_topic.aspx?fid=114 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2013, 20:42 |
|
Выборка из БД по нескольким параметрам с использованием MVS2012
|
|||
---|---|---|---|
#18+
Cat2Так быстрее работает Код: c# 1.
Не сработет, если значение в поле будет равно null: Код: sql 1. 2. 3. 4. 5. 6.
Код: plaintext 1. 2. 3. 4. 5.
Да и запрос от такого трюка может и не стать легче: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: sql 1. 2. 3. 4.
Код: plaintext 1. 2. 3. 4.
- Table Scan в плане запроса, индекс игнорируется; Код: sql 1.
Код: plaintext 1. 2. 3. 4.
- абсолютно то же самое. Если попробовать вот так: Код: sql 1.
то будет вот так: Код: plaintext 1. 2. 3. 4.
- index scan, и результат по стоимости не намного лучше. Ну и, наконец, Код: sql 1.
Код: plaintext 1. 2. 3. 4.
Комментарии, думаю, не нужны. В случае вопроса данной темы самый оптимальный вариант - динамическое формирование текста запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2013, 06:49 |
|
|
start [/forum/topic.php?fid=20&msg=38468530&tid=1403664]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 162ms |
0 / 0 |