С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Не работает запрос поиска в базе данных

15.08.2012, 02:36. Показов 1661. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть запрос, который я тестировал в Sql Management Studio 2008. Он работает.


Но, когда я составляю запрос, то он не срабатывает. Возвращается 0 записей. Сразу говорю, метод GetData работает 100%, так как все запросы получения данных в программе работают через него и все данные программа исправно получает, проблема точно в методе выложенном ниже. Что я делаю не правильно, если учитывать, что я хочу создавать объекты SqlParameter, а не напрямую подставлять значения в текст?

C#
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
        internal List<DbDataRecord> SearchDebitors(string name, int? postNumber, string phoneNumber)
        {
            bool nameIsFilled = !string.IsNullOrWhiteSpace(name);
            bool postNumberIsFilled = postNumber != null;
            bool phoneNumberIsFilled = !string.IsNullOrWhiteSpace(phoneNumber);
            if (!nameIsFilled && !postNumberIsFilled && !phoneNumberIsFilled)
                return null;
 
            StringBuilder sbCommandText = new StringBuilder("SELECT * FROM Debitors");
            SqlCommand command = new SqlCommand();
            int lastLength = sbCommandText.Length;
            if (nameIsFilled)
            {
                command.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar) { Value = name });
                sbCommandText.Append(" WHERE Name LIKE '%@Name%'");
            }
            if (postNumberIsFilled)
            {
                if (lastLength != sbCommandText.Length)
                    sbCommandText.Append(" AND ");
                else
                    sbCommandText.Append(" WHERE ");
                command.Parameters.Add(new SqlParameter("@PostNumber", SqlDbType.Int) { Value = (int)postNumber });
                sbCommandText.Append("PostNumber LIKE '%@PostNumber%'");
            }
            if (phoneNumberIsFilled)
            {
                if (lastLength != sbCommandText.Length)
                    sbCommandText.Append(" AND ");
                else
                    sbCommandText.Append(" WHERE ");
                command.Parameters.Add(new SqlParameter("@PhoneNumber", SqlDbType.NChar) { Value = phoneNumber });
                sbCommandText.Append("PhoneNumber LIKE '%@PhoneNumber%'");
            }
 
            command.CommandText = sbCommandText.ToString();
            return GetData(command);
        }
Построение запроса StringBuilder'ом проверял, при любом раскладе получается правильный запрос, не вылетает исключений в методе GetData.
Вот так проверял:
C#
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
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Tester.TestSearch();
            return;
 
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
 
    class Tester
    {
        public static void TestSearch()
        {
            DataAccessLayer dal = new DataAccessLayer();
            List<System.Data.Common.DbDataRecord> dbRec = null;
            dbRec = dal.SearchDebitors(null, null, null);
            dbRec = dal.SearchDebitors("Алексей", null, null);
            dbRec = dal.SearchDebitors("Алексей", 222222, null);
            dbRec = dal.SearchDebitors("Алексей", 222222, "89991234567");
            dbRec = dal.SearchDebitors(null, 222222, "89991234567");
            dbRec = dal.SearchDebitors(null, null, "89991234567");
            dbRec = dal.SearchDebitors("Алексей", null, "89991234567");
        }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2012, 02:36
Ответы с готовыми решениями:

Не работает запрос к базе данных
Имеется запрос к базе данных, который сортирует базу данных. Все не подходящие значения он скрывает, фишка в том, что с 6 комбо боксами в...

Запрос к базе данных работает со второго раза
Здраствуйте! Делаю поиск по БД, а он работает со второго раза. Вот код: private void btnFind_Click(object sender, EventArgs e) ...

Запрос к базе данных
У меня есть запрос, которому соответствует только 1 значение из таблицы (я запрашиваю поле типа char(10)), как можно закрепить ответ за...

8
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
15.08.2012, 08:42
нужно протестировать в пошаговом режиме и посмотреть что там получается в sbCommandText в итоге перед самым возвратом из метода.
У меня похожая тема была в программе. Я брал строку запроса, которая в результате у меня получалась после построения в стрингбильдере, и тупо тестил напрямую в СУБД. Или смотрел внимательно на строку запроса и искал ошибку.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
15.08.2012, 10:38  [ТС]
Ввёл в поиск в программе те же данные, что на скриншоте я вводил напряму в запрос. Вот какая строка получилась уже после присвоения command.CommandText = sbCommandText.ToString();:
SQL
1
SELECT * FROM Debitors WHERE Name LIKE '%@Name%' AND PhoneNumber LIKE '%@PhoneNumber%'
Добавлено через 3 минуты
Какой-то косяк в коде получающем данные с формы и передающем данные в метод. Сейчас проверю. Ведь в запросе нету ещё 1-го параметра.

Добавлено через 3 минуты
Так, исправил (перед PhoneNumber пробел есть):
SQL
1
2
SELECT * FROM Debitors WHERE Name LIKE '%@Name%' AND PostNumber LIKE '%@PostNumber%' AND 
PhoneNumber LIKE '%@PhoneNumber%'
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
15.08.2012, 10:40
Потестил сейчас такого рода запрос, вполне корректно работает. а в @name значение есть?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
15.08.2012, 10:42  [ТС]
Цитата Сообщение от gitarillo Посмотреть сообщение
Я брал строку запроса, которая в результате у меня получалась после построения в стрингбильдере, и тупо тестил напрямую в СУБД
А как её затестить напрямую? Хранимую процедуру может попробовать создать... сейчас попробую, иначе я не знаю как с эмитировать параметры.
0
 Аватар для gitarillo
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
15.08.2012, 10:46
А как её затестить напрямую?
Параметры действительно можно сэмититовать. А так взять строку запроса и выполнить запрос непосредственно в СУБД.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
15.08.2012, 10:49  [ТС]
Цитата Сообщение от gitarillo Посмотреть сообщение
а в @name значение есть?
Да.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
15.08.2012, 11:55  [ТС]
Всё сделал тестовую версию. Может любой скачать, запустить и у себя затестить. Это консольное приложение с локальной базой данных SQL Compact Edition, можете добавлять данные, получать все записи и затестить мой метод поиска, который у меня не работает.

Надеюсь кто-нибудь поможет и не зря я сидел этот проект отдельный делал.

Вот так выглядит класс Program.cs в этом проекте, на строке 22 как раз тот не рабочий поиск:
C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
 
namespace ConsApp_TestQuery
{
    class Program
    {
        static void Main(string[] args)
        {
            DataAccessLayer dal = new DataAccessLayer();
            //dal.SaveNewDebitor(Guid.NewGuid(), "Алексеев Дмитрий Сергеевич", 158963, "89691285478");
            //dal.SaveNewDebitor(Guid.NewGuid(), "Андриянов Сергей Владимирович", 172923, "89688885479");
            List<DbDataRecord> all = dal.GetAllDebitors();
            foreach (DbDataRecord person in all)
            {
                Console.WriteLine("Имя: {1}{0}Номер телефона: {2}{0}Почтовый индекс: {3}{0}{0}", 
                    Environment.NewLine, person["Name"], person["PhoneNumber"], person["PostNumber"]);
            }
            List<DbDataRecord> rec = dal.SearchDebitors("ксе", 963, "969");
            Console.ReadKey();
        }
    }
}
А так в своём проекте создал хранимую процедуру:
SQL
1
2
3
4
5
ALTER PROCEDURE dbo.SearchDebitors(@Name nvarchar(50), @PostNumber INT, @PhoneNumber NCHAR(30))
 
AS
    SELECT * FROM Debitors WHERE [Name] LIKE '%@Name%' AND PostNumber LIKE '%@PostNumber%' AND PhoneNumber LIKE '%@PhoneNumber%'
    RETURN
И она не возвращает результат так же как и метод без хранимой процедуры.
Вложения
Тип файла: zip ConsApp_TestQuery.zip (30.7 Кб, 19 просмотров)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
16.08.2012, 11:38  [ТС]
Решил проблему, вот как правильно строить запрос:
C#
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
        internal List<DbDataRecord> SearchDebitors(string name, int? postNumber, string phoneNumber)
        {
             //====КОД====
             //====КОД====
            if (nameIsFilled)
            {
                command.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar) { Value = name });
                sbCommandText.Append(" WHERE [Name] LIKE '%' + @Name + '%'");
            }
            if (postNumberIsFilled)
            {
                if (lastLength != sbCommandText.Length)
                    sbCommandText.Append(" AND ");
                else
                    sbCommandText.Append(" WHERE ");
                command.Parameters.Add(new SqlParameter("@PostNumber", SqlDbType.Int) { Value = (int)postNumber });
                sbCommandText.Append("CAST (PostNumber AS nvarchar(11)) LIKE '%' + CAST(@PostNumber AS nvarchar(11)) + '%'");
            }
            if (phoneNumberIsFilled)
            {
                if (lastLength != sbCommandText.Length)
                    sbCommandText.Append(" AND ");
                else
                    sbCommandText.Append(" WHERE ");
                command.Parameters.Add(new SqlParameter("@PhoneNumber", SqlDbType.NChar) { Value = phoneNumber, IsNullable = true });
                sbCommandText.Append("PhoneNumber LIKE '%' + @PhoneNumber + '%'");
            }
             //====КОД====
             //====КОД====
        }
В итоге, при вводе 3-ёх значений в поиск (3 строки поиска), получаем запрос:
SQL
1
2
3
4
SELECT * FROM Debitors WHERE 
[Name] LIKE '%' + @Name + '%' AND 
CAST (PostNumber AS nvarchar(11)) LIKE '%' + CAST(@PostNumber AS nvarchar(11)) + '%' AND 
PhoneNumber LIKE '%' + @PhoneNumber + '%'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2012, 11:38
Помогаю со студенческими работами здесь

Запрос к базе данных
Есть такая база, пишу к ней запрос на выборку, вывод данных. Немного непонятно как делать выборку из Марки и Модели автомобиля. Пишу вот...

Запрос к базе данных
Сделал приложение к базе данных Access на Visual Basic .Net 2008. Итак, на форме стоят: - NameTextBox - AdressTextBox ...

Не срабатывает запрос к базе данных
Запрос не срабатывает, пишет, что синтаксическая ошибка, что не правильно ? myOleDbCommand.CommandText = &quot;select * from nomera...

LINQ-запрос к базе данных
Запрос к базе данных каждые 5 секунд (тест) public string GetDBCont(string req = &quot;&quot;) { try { ...

Динамический запрос к базе данных
Доброго всем времени суток. Помогите разобраться с проблемой. На C# есть приложение которое работает с базой данных (MS SQL server) через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru