С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16

Запрос Sql

01.02.2013, 09:57. Показов 4090. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята объясните пожалуйста мою ошибку...
Делаю один из SQL запросов в ручную, при компилировании выдает ошибку что не правильно, выглядит так...
C#
1
//string queryPot = "SELECT [Номер договора],[Наименование договора],[Наименование подстанции],[Наименование фидера],[Номер ТУ],[Наименование ТУ] FROM [Договор],[Список наименований подстанций],[Фидер],[Точка учета] WHERE ([Договор].[ID_договор]=[Подстанция].[id_договор] AND [Подстанция].[id_наименование_подстанции]=[Список наименований подстанции].[ID_наименование_подстанции] AND [Подстанция].[ID_подстанция]=[Фидер].[id_подстанция] AND [Фидер].[ID_фидер]=[Точка учета].[id_фидер])";
Этот же запрос делаю через Аксесс "мастер запросов", работает правильно, выглядит так...
C#
1
string queryPot = "SELECT Договор.[Номер договора], Договор.[Наименование договора], [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], [Точка учета].[Номер ТУ], [Точка учета].[Наименование ТУ] FROM ([Список наименований подстанций] INNER JOIN ((Договор INNER JOIN Подстанция ON Договор.ID_договор = Подстанция.id_договор) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN [Точка учета] ON Фидер.ID_фидер = [Точка учета].id_фидер";
Ошибка, в 1 запросе в конструкции WHERE...возникает из за того что берем [Наименование подстанции] из дочерней таблицы...кусочек Схема ниже..

Вопрос: как должна правильно выглядеть конструкция WHERE ???
Миниатюры
Запрос Sql  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2013, 09:57
Ответы с готовыми решениями:

SQL Запрос?
Здравсвуйте друзья. Программа пинга компов по сети. Пропинговав прога заносит данные в таблицу history_ping. Мне нужно, чтоб я мог...

Запрос SQL
БД агентство недвижимости. Таблицы и связи между ними такие: Поле запроса: Вот мой запрос: SELECT * FROM , Where . = ....

SQL запрос LIKE
Мне нужно вывести в DataGridView те строки, где название дисциплины = определённому значению, например Name = "Русский_язык" ...

10
56 / 56 / 11
Регистрация: 13.04.2009
Сообщений: 169
01.02.2013, 11:12
вы в качестве выборки в первом запросе указали таблицу [Точка учета] - в этом ошибка. нужно указать столбцы выборки.
1
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
01.02.2013, 12:12
Degni, даже Access пользует JOIN'ами, что вам мешает? Зачем это слабочитаемое перечисление таблиц через запятую, которое путает своих же создателей. Допустим, таблица [Подстанция] у во WHERE есть, а в FROM'е отсутствует. Вполне возможно, что ошибка заключается в этом.
1
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16
01.02.2013, 18:18  [ТС]
Спасибо вам, что уделили внимание...
kodv, вы правы! Но я хотел разобраться более точно...но психанул и в мастере сделал нужные запросы, запили в код и все работает =)
0
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16
04.02.2013, 06:37  [ТС]
Еще возник вопрос:
Не получается сделать выборку по дате...считывая с Textbox2 и Textbox3..(с...по...)

Выборку по имени делаю так...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 private void button1_Click(object sender, EventArgs e)
        {
            string namePod = textBox1.Text.ToString();
            if (namePod != "")
            {
                string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] 
FROM (([Список наименований подстанций] INNER JOIN Подстанция ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер 
WHERE [Список наименований подстанций].[Наименование подстанции] LIKE '"+namePod+"%'";
                loadDataGridFider(queryFider);
 
            }
            else
            {
                MessageBox.Show("Введите Наименование подстанции", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
А вот по дате не получает...пробую (BETWEEN ...AND...) не выходит..
Вопрос: как правильно добавить в запрос выборку по диапазону даты для поля [Показатели фидера].[Дата фидера] ?
0
21 / 21 / 7
Регистрация: 21.01.2013
Сообщений: 38
04.02.2013, 13:59
Создавай хранимую процедуру
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE PROCEDURE DATA   
    @dat1 DATE,
    @dat2 DATE
    
AS
BEGIN
    
    SET NOCOUNT ON;
 
SELECT    *
FROM      dbo.Table
WHERE     ([DATA] BETWEEN @dat1 AND @dat2)
 
END
GO
Data -имя поля в таблице. Проверить можно в sql server при помощи запроса (Exeс имя процедуры 'дата1','дата2')
1
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16
05.02.2013, 06:37  [ТС]
Спасибо...
но для меня это сложно..не понимаю этого...видимо мой вопрос вы не правильно поняли...

Добавлено через 58 минут
запрос с такой конструкцией WHERE...он не работает...дибил потому что =(
C#
1
2
3
4
string FirstData = textBox2.Text.ToString();
 string SecondData = textBox3.Text.ToString();
            string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] FROM (([Список наименований подстанций] INNER JOIN Подстанция ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер 
WHERE [Показатели фидера].[Дата фидера] BETWEEN "+FirstData+" AND "+SecondData+" ";
Поле [Дата фидера] имеет формат Дата (дд.мм.гггг)...
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
05.02.2013, 09:17
Degni, Если у вас не работает сформированный запрос, то проверяйте, что сформировалось. Хотя бы месседжбоксом можно вывести на экран. Многие вопросы могут быстро отпасть. В данном случае. даже если вы введете даты в нужном формате (никто не мешают пользователю ввести и какую-нибудь чепуху вместо даты в текстбокс), то запрос не выполнится потому, что в запросе даты должны обрамляться одинарными ковычками.
1
21 / 21 / 7
Регистрация: 21.01.2013
Сообщений: 38
05.02.2013, 15:47
Как вариант сделай так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Создаем строку подключения 
using (
                      SqlConnection con =
                          new SqlConnection(@"Data Source=localhost;Initial Catalog=test; integrated security=true;"))
            {
                con.Open();
               
                 string @FirstData = textBox1.Text.ToString();
                            string @SecondData = textBox2.Text.ToString();
 //Создаем новый DataAdapter в который запихиваем запрос
                using (SqlDataAdapter a = new SqlDataAdapter( "SELECT * " +
                                                                  "From ChildClass " +
                                                                  "WHERE ([DAta] BETWEEN'" +
                                                                  Convert.ToDateTime(@FirstData) + "' AND '" +
                                                                  Convert.ToDateTime(@SecondData) + "')", con))
                {
                    // Используем DataAdapter для заполнения DataTable
                    DataTable t = new DataTable();
                    a.Fill(t);
                    // Показываем данные на экране
                    dataGridView1.DataSource = t;
                }
            }
Либо можно не textBox'у присваивать значения а dateTimePicker1, так даже правильнее.. ибо textBox можно ввести какой -нибудь бред, и запрос не пройдет, а тут все хорошо будет.
C#
1
2
3
4
5
6
7
 DateTime @FirstData = dateTimePicker1.Value ;
                DateTime @SecondData = dateTimePicker2.Value ;
                using (SqlDataAdapter a = new SqlDataAdapter( "SELECT * " +
                                                                  "From ChildClass " +
                                                                  "WHERE ([DAta] BETWEEN'" +
                                                                  @FirstData + "' AND '" +
                                                                  @SecondData + "')", con))
Проверял у себя, поиск работал правильно)
1
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16
06.02.2013, 04:53  [ТС]
спасибо большое, что помогаете!!! Согласен с вами что лучше будет использовать dateTimePicker1...

Zen1a, Спасибо за ваши идеи...буду пытаться реализовать под себя...

У меня форма выглядит таким образом...подключение и выгрузка в датагрид...
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
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
namespace KhES
{
    public partial class Form3 : Form
    {
        public OleDbConnection database;
        public Form3()
        {
            InitializeComponent();
            string mycon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=KhES.mdb";
            try
            {
                database = new OleDbConnection(mycon);
                database.Open();
 
                string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] FROM (([Список наименований подстанций] INNER JOIN Подстанция ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер;";
                loadDataGridFider(queryFider);
            }
            catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
                 return;
             }
        }
        public void loadDataGridFider(string sqlQueryString)
        {
            OleDbCommand SQLquery = new OleDbCommand();
            DataTable data = null;
            dataGridView1.DataSource = null;
            OleDbDataAdapter dataAdapter = null;
            dataGridView1.Columns.Clear();
 
            SQLquery.CommandText = sqlQueryString;
            SQLquery.Connection = database;
            data = new DataTable();
            dataAdapter = new OleDbDataAdapter(SQLquery);
            dataAdapter.Fill(data);
            dataGridView1.DataSource = data;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.ReadOnly = true;
 
            dataGridView1.Columns[0].Width = 150;
            dataGridView1.Columns[1].Width = 60;
            dataGridView1.Columns[2].Width = 70;
            dataGridView1.Columns[3].Width = 70;
            dataGridView1.Columns[4].Width = 30;
            dataGridView1.Columns[5].Width = 100;
            dataGridView1.Columns[6].Width = 100;
            dataGridView1.Columns[7].Width = 100;
            dataGridView1.Columns[8].Width = 100;
            dataGridView1.Columns[9].Width = 100;
        }
//Поиск по номеру...
private void button2_Click(object sender, EventArgs e)
        {
            string numberFider = textBox4.Text.ToString();
 
            if (numberFider != "")
            {
                string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] FROM (([Список наименований подстанций] INNER JOIN Подстанция ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер 
WHERE Фидер.[Наименование фидера] LIKE '" + numberFider + "%'";
                
loadDataGridFider(queryFider);
            }
            else
            {
                MessageBox.Show("Введите Наименование фидера", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
Мне интересно ваше мнение...разумно ли так? примитивно?
Исходник выложу...Form2,3,4 на вывод...
Вложения
Тип файла: rar KhES.rar (887.1 Кб, 24 просмотров)
0
0 / 0 / 0
Регистрация: 29.12.2012
Сообщений: 16
06.02.2013, 10:39  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void button1_Click(object sender, EventArgs e)
        {
            DateTime @firstdata = dateTimePicker1.Value;
            DateTime @seconddata = dateTimePicker2.Value;
            try
            {
                string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] FROM (([Список наименований подстанций] INNER JOIN Подстанция ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер
WHERE [Показатели фидера].[Дата фидера] BETWEEN '"+@firstdata+"' AND '"+@seconddata+"'";    
            loadDataGridFider(queryFider);
            }
             catch (Exception ex)
             {
           MessageBox.Show(ex.Message);
      return;
             }
        }
Ошибка: {"Несоответствие типов данных в выражении условия отбора."}

Добавлено через 5 часов 1 минуту
Урааа мужики!!! сделал!!! криворука, но результат есть...мои рассуждения ниже - вдруг кому нить пригодится...

1. Сделал запрос в мастере в Акцесе...выглядит так(ниже с 1/2/2013 до 4/2/2013)...если запилить в код все работает..
SQL
1
2
3
SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход]
FROM ([Список наименований подстанций] INNER JOIN (Подстанция INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер
WHERE ((([Показатели фидера].[Дата фидера]) BETWEEN #2/1/2013# AND #2/4/2013#));
Можно заметит, что в запросе дата посылается в американском формате 'MM/dd/yyy"
Поэтому следующий код
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
 private void button1_Click(object sender, EventArgs e)
        {
            //DateTime firstdata = dateTimePicker1.Value;
            //DateTime seconddata = dateTimePicker2.Value;
 
            string firstdata = dateTimePicker1.Text.ToString();
            string seconddata = dateTimePicker2.Text.ToString();
 
            //string firstdata = textBox1.Text.ToString();
            //string seconddata = textBox2.Text.ToString();
            
            try
            {
            
                //string namePod = textBox1.Text.ToString();
               string queryFider = "SELECT [Список наименований подстанций].[Наименование подстанции], Фидер.[Наименование фидера], Фидер.[Номер счетчика], [Показатели фидера].[Дата фидера], [Показатели фидера].[Расчетный коэффициент], [Показатели фидера].[Начальный показатель], [Показатели фидера].[Конечный показатель], [Показатели фидера].Разность, [Показатели фидера].[Расход энергии], [Показатели фидера].[Население расход] FROM ([Список наименований подстанций] INNER JOIN (Подстанция INNER JOIN Фидер ON Подстанция.ID_подстанция = Фидер.id_подстанция) ON [Список наименований подстанций].ID_наименование_подстанции = Подстанция.id_наименование_подстанции) INNER JOIN [Показатели фидера] ON Фидер.ID_фидер = [Показатели фидера].id_фидер 
WHERE ((([Показатели фидера].[Дата фидера]) Between #" + firstdata + "# And #" + seconddata + "#))";
            loadDataGridFider(queryFider);
            }
             catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                 return;
             }
datePicker делаем в Стринг..но дата все равно в dd/mm/yyyy

Заходим в свойство datePicker и меню CustomFormat прописываем MM/dd/yyyy...дата отражается "по американски"...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2013, 10:39
Помогаю со студенческими работами здесь

SQL запрос
Добрый день. Нужно удалить записи если в поле data_f (строковая данyые даты в формате "21.10.2010 14:51:22"), удалить например...

Запрос SQL
Подскажите, как запрос в таком случии сделать. В названии столбцов DataGridView писать дни месяця и если можна дни недели при выборе месяца...

sql запрос
Помогите плз если ето возможно написать запрос. Дана таблица без primery key. Такие столбцы (код доумента, код товара, количество,...

Sql запрос в C# к БД
Доброго дня форумчане. Возник вопрос, который не могу решить. Имеется 3 таблицы В таблице Раб_место_сотрудник происходит связывание...

SQL запрос в С#
Добрый день, никак не получается адаптировать SQL запрос в C#. Данный код принадлежит кнопке Поиска по диапазону( например, фильмы с 2000...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru