Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
1

Как правильно составить SQL-запрос?

30.06.2014, 12:16. Просмотров 836. Ответов 16
Метки нет (Все метки)

Пытаюсь писать службу, взаимодействующую с SQL. Вопрос по запросу у меня....имеется следующий код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  protected override void OnStart(string[] args)
        {
            IDbCommand command1 = con.CreateCommand();
            command1.CommandText = "SELECT pi_system.value_parameter, normal.critical,rules.znak,rules. id_role,rules.id_type_message FROM pi_system, rules, normal WHERE rules.id_parameter=pi_system.id_parameter AND rules.id_norm=normal.id_norm";
            IDataReader dr = command1.ExecuteReader();
            while (dr.Read())
            {
                int z = Convert.ToInt32(dr["znak"]);
                double v = Convert.ToDouble(dr["value"]);
                double c = Convert.ToDouble(dr["critical"]);
                if (( z==1 ) && (v<c))
                {
                   
                     IDbCommand command2 = con.CreateCommand();
                     command2.CommandText = "INSERT INTO message (id_type_message, id_author,text,send_time,number) VALUES(???????????)";
 
                }
 
            }
        }
Необходимо чтобы в запросе :command2.CommandText = "INSERT INTO message (id_type_message, id_author,text,send_time,number) VALUES(???????????)";

в столбцы id_type_message, id_author,text,send_time,number выводились значения из других таблиц...как это сделать...отя бы пример какой-нибудь...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 12:16
Ответы с готовыми решениями:

Как правильно составить запрос к SQL Server?
всем привет! программа должна по нажатию кнопки писать в базу данных: ...

Правильно составить запрос к БД
У меня есть t.Text - 3 буквы, которые введены. DataTable dt = GetMusic(запрос); - так у меня...

Правильно составить поисковый запрос к бд
var klients = db.Query&lt;Klient&gt;(&quot;SELECT * From Klient WHERE brand = '&quot; + textBox5.Text + &quot;'&quot;); Все...

Составить запрос SQL
Добрый вечер, нужна ваша помощь, помогите пожалуйста составить запрос более корректно. Пишу...

SQL AddValue как правильно?
Привет есть код. private void query_Click(object sender, RoutedEventArgs e) { ...

16
Igor8
38 / 38 / 20
Регистрация: 20.05.2010
Сообщений: 111
30.06.2014, 13:09 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected override void OnStart(string[] args)
          {
              var command1 = cn.CreateCommand();
              command1.CommandText = "SELECT pi_system.value_parameter, normal.critical,rules.znak,rules. id_role,rules.id_type_message FROM pi_system, rules, normal WHERE rules.id_parameter=pi_system.id_parameter AND rules.id_norm=normal.id_norm";
              var dr = command1.ExecuteReader();
              while (dr.Read())
              {
                  int z = Convert.ToInt32(dr["znak"]);
                  double v = Convert.ToDouble(dr["value"]);
                  double c = Convert.ToDouble(dr["critical"]);
                  if ((z == 1) && (v < c))
                  {
 
                      var command2 = cn.CreateCommand();
                      command2.CommandText = "INSERT INTO message (id_type_message, id_author,text,send_time,number) VALUES(@znak,@value,@critical)";
                      command2.Parameters.AddWithValue("@znak", z);
                      command2.Parameters.AddWithValue("@value", v);
                      command2.Parameters.AddWithValue("@critical", c);
                      command2.ExecuteReader();
                  }
 
              }
          }
1
fast1kkk
30 / 29 / 13
Регистрация: 15.02.2014
Сообщений: 157
30.06.2014, 13:13 3
Лучший ответ Сообщение было отмечено Fitprog как решение

Решение

Fitprog, или так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 protected override void OnStart(string[] args)
        {
            IDbCommand command1 = con.CreateCommand();
            command1.CommandText = "SELECT pi_system.value_parameter, normal.critical,rules.znak,rules. id_role,rules.id_type_message FROM pi_system, rules, normal WHERE rules.id_parameter=pi_system.id_parameter AND rules.id_norm=normal.id_norm";
            IDataReader dr = command1.ExecuteReader();
            while (dr.Read())
            {
                int z = Convert.ToInt32(dr["znak"]);
                double v = Convert.ToDouble(dr["value"]);
                double c = Convert.ToDouble(dr["critical"]);
                if (( z==1 ) && (v<c))
                {
                   
                     IDbCommand command2 = con.CreateCommand();
                     command2.CommandText = "INSERT INTO message (id_type_message, id_author,text,send_time,number) VALUES('typeMessage', 'id', 'send_time', 'number')";
 
                }
 
            }
        }
1
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
30.06.2014, 14:17  [ТС] 4
Я наверное плохо сформулировала в чем проблема....
В коде есть условие if (( z==1 ) && (v<c)) (оно означает если знак равен 1 в таблице и если значение value_parametr меньше чем critical тогда в таблицу Message добавляется строка(сообщение) данные из которой поступают из связанных с ней таблиц shablon, role.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
 
 
namespace Summer
{
    public partial class Form1 : Form
    {
        string connection;
        SqlConnection con;
 
        public Form1()
        {
            InitializeComponent();
            System.IO.StreamReader file = new System.IO.StreamReader(@"connection.txt");
            connection = file.ReadLine();
            con = new SqlConnection(connection);
            con.Open();
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            IDbCommand command1 = con.CreateCommand();
            command1.CommandText = "SELECT pi_system.value_parameter, normal.critical,rules.znak,rules. id_role,rules.id_type_message FROM pi_system, rules, normal WHERE rules.id_parameter=pi_system.id_parameter AND rules.id_norm=normal.id_norm";
            IDataReader dr = command1.ExecuteReader();
            while (dr.Read())
            {
                int z = Convert.ToInt32(dr["znak"]);
                int v = Convert.ToInt32(dr["value_parameter"]);
                int c = Convert.ToInt32(dr["critical"]);
                if ((z == 1)  && (v < c))
                {
 
                    IDbCommand command2 = con.CreateCommand();
                    command2.CommandText = "INSERT INTO message (id_type_message, id_author,text) SELECT shablon.id_type_message,role.id_role,shablon.text FROM shablon,role";
 
                }
 
            }
            dr.Close();
        }
    }
}
0
Миниатюры
Как правильно составить SQL-запрос?  
fast1kkk
30 / 29 / 13
Регистрация: 15.02.2014
Сообщений: 157
30.06.2014, 15:42 5
Fitprog, и в чем проблема? Вставьте в условие
C#
1
2
 IDbCommand command2 = con.CreateCommand();
command2.CommandText = "INSERT INTO message (id_type_message, id_author,text,send_time,number) VALUES('typeMessage', 'id', 'send_time', 'number')";
0
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
30.06.2014, 19:08  [ТС] 6
Проблема в том, что не вносится никаких изменений в БД, хотя условие выполняется
0
fast1kkk
30 / 29 / 13
Регистрация: 15.02.2014
Сообщений: 157
30.06.2014, 19:14 7
Fitprog, у вас запрос не правильно построен, вставте тот который вас посоветывали
0
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
30.06.2014, 20:13  [ТС] 8
Я вставила он не работает

Добавлено через 57 минут
Подскажите пожалуйста, может я что-то неверно поменяла?Я вставила так
C#
1
command2.CommandText = "INSERT INTO message (id_message,id_type_message, id_author,text,send_time,number) VALUES('id_message','id_type_message', 'id_author','text', 'send_time', 'number')";
0
fast1kkk
30 / 29 / 13
Регистрация: 15.02.2014
Сообщений: 157
30.06.2014, 20:19 9
Fitprog, Попробуйте в Values вносить корректные данные, если числовые, то числовые, строковые - строковые!
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
01.07.2014, 05:42 10
Лучший ответ Сообщение было отмечено Fitprog как решение

Решение

fast1kkk, учите SQL. Как говорится, почувствуйте разницу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private void button1_Click(object sender, EventArgs e)
    {
        IDbCommand command1 = con.CreateCommand();
        command1.CommandText =
            "INSERT
                INTO message (id_type_message, id_author, text)
                SELECT rules.id_type_message, rules.id_role, shablon.text
                    FROM rules
                        JOIN pi_system
                            ON pi_system.id_parameter = rules.id_parameter
                        JOIN normal
                            ON normal.id_norm = rules.id_norm
                        JOIN shablon
                            ON shablon.id_type_message = rules.ir_type_message
                    WHERE rules.znak = 1
                        AND pi_system.value_parameter < normal.critical";
        command1.ExecuteNonQuery();
    }
PS: Столбцы id_message, send_time и number я не трогал. id_message, как я понял, является IDENTITY-столбцом. В send_time и number из ваших 4-х постов я не понял, что нужно вставлять. Но есть ощущение, что значения в столбцы send_time и number можно вставлять просто поправив запрос, не трогая код на C#.
PPS: Когда вы делали картинку со схемой БД, которую вы выложили сюда, вы преследовали цель, занять как можно меньше пространства этой картинкой? Из предоставленной вами схемой БД не понятно, какие связи имеются между таблицами. Поэтому я определил для себя связи между вашими таблицами методом "наугад".
1
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
01.07.2014, 08:03  [ТС] 11
Спасибо за ответ, схема данных просто больше намного, там еще куча таблиц, чтобы не загромождать и не грузить лишней информацией всю выкладывать не стала...
0
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
01.07.2014, 08:36  [ТС] 12
в send_time необходимо вставлять текущее время, number-это номер сообщения.
Про картинку-там просто еще есть таблицы, не отела загромождать и давать лишнюю информацию...
0
Миниатюры
Как правильно составить SQL-запрос?  
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
01.07.2014, 09:12  [ТС] 13
И еще вопрос: столбец number необходимо заполнять значениями на 1 больше :1,2,3 и т.д. как это можно сделать?Цикл же получается будет?
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
01.07.2014, 09:26 14
Цитата Сообщение от Fitprog Посмотреть сообщение
в send_time необходимо вставлять текущее время
С учетом этого дополнения запрос будет выглядеть так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
INSERT
                INTO message (id_type_message, id_author, text, send_time)
                SELECT rules.id_type_message, rules.id_role, shablon.text, GETDATE() -- Вроде как вы с MS SQL Server работаете, поэтому GETDATE()
                    FROM rules
                        JOIN pi_system
                            ON pi_system.id_parameter = rules.id_parameter
                        JOIN normal
                            ON normal.id_norm = rules.id_norm
                        JOIN shablon
                            ON shablon.id_type_message = rules.ir_type_message
                    WHERE rules.znak = 1
                        AND pi_system.value_parameter < normal.critical
Цитата Сообщение от Fitprog Посмотреть сообщение
number-это номер сообщения
В принципе, это было и так понятно. Не понятно, по какому принципу он проставляется письмам.
Цитата Сообщение от Fitprog Посмотреть сообщение
Про картинку-там просто еще есть таблицы, не отела загромождать и давать лишнюю информацию...
В диаграму можно и не все таблицы включать. То есть, можно было выкинуть некоторые таблицы, чтобы для данного вопроса диаграмма не выглядела избыточной. Я говорил про то, что связи между таблицами не видны. Допустим, связь message.id_avtor - role.id_role не выглядит очевидной, а на предыдущей диаграмме связей не видно. Но я вроде угадал)

Добавлено через 10 минут
Цитата Сообщение от Fitprog Посмотреть сообщение
И еще вопрос: столбец number необходимо заполнять значениями на 1 больше :1,2,3 и т.д. как это можно сделать?Цикл же получается будет?
Не обязательно. Но задача уже не столь тривиальная, как предыдущие. Могу предложить такой запрос:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
INSERT
    INTO message (id_type_message, id_author, text, send_time, number)
    SELECT rules.id_type_message, rules.id_role, shablon.text, GETDATE(), (SELECT MAX(number) FROM message) + ROW_NUMBER() OVER (ORDER BY rules.id_type_message) -- Не знаю, важен ли вам порядок нумерации. Взял rules.id_type_message, как первое попавшееся поле, так как без ORDER BY будет выдаваться ошибка
        FROM rules
            JOIN pi_system
                ON pi_system.id_parameter = rules.id_parameter
            JOIN normal
                ON normal.id_norm = rules.id_norm
            JOIN shablon
                ON shablon.id_type_message = rules.ir_type_message
    WHERE rules.znak = 1
        AND pi_system.value_parameter < normal.critical
Правда здесь уже есть оговорка. Конструкция ROW_NUMBER доступна начиная с версии MS SQL SERVER 2008
1
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
01.07.2014, 09:39  [ТС] 15
Спасибо Вам!Буду теперь разбираться что да как=)Помогли)

Добавлено через 9 минут
У меня ругается программа на эту строчку:
C#
1
command2.ExecuteNonQuery();
Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть.

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
 
 
namespace Summer
{
    public partial class Form1 : Form
    {
        string connection;
        SqlConnection con;
 
        public Form1()
        {
            InitializeComponent();
            System.IO.StreamReader file = new System.IO.StreamReader(@"connection.txt");
            connection = file.ReadLine();
            con = new SqlConnection(connection);
            con.Open();
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;
            IDbCommand command1 = con.CreateCommand();
            command1.CommandText = "SELECT pi_system.value_parameter, normal.critical,rules.znak,rules. id_role,rules.id_type_message FROM pi_system, rules, normal WHERE rules.id_parameter=pi_system.id_parameter AND rules.id_norm=normal.id_norm";
            IDataReader dr = command1.ExecuteReader();
            while (dr.Read())
            {
                int z = Convert.ToInt32(dr["znak"]);
                int v = Convert.ToInt32(dr["value_parameter"]);
                int c = Convert.ToInt32(dr["critical"]);
                if ((z == 1) && (v < c))
                {
                    IDbCommand command2 = con.CreateCommand();
                    now = DateTime.Now;
                    string s = now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    command2.CommandText = "INSERT INTO message (id_type_message, id_avtor, text, send_time,number)  SELECT rules.id_type_message, rules.id_role, shablon.text, GETDATE(), (SELECT MAX(number) FROM message) + ROW_NUMBER() OVER (ORDER BY rules.id_type_message) FROM rules JOIN pi_system ON pi_system.id_parameter = rules.id_parameter JOIN normal ON normal.id_norm = rules.id_norm JOIN shablon ON shablon.id_type_message = rules.ir_type_message WHERE rules.znak = 1 AND pi_system.value_parameter < normal.critical";
                   
                 command2.ExecuteNonQuery();
                }
             
            }
            dr.Close();
        }
    }
}
0
kodv
1425 / 1098 / 344
Регистрация: 11.04.2011
Сообщений: 2,606
Завершенные тесты: 1
01.07.2014, 09:56 16
Fitprog, Ну так если есть открытый DataReader, то иных действий с БД, кроме как чтение данных через DataReader, делать нельзя. Я вам дал весь код кнопки. Ни чего другого там, теоретически, быть не должно

Добавлено через 3 минуты
Кстати, да. Сейчас вы пытаетесь сделать вариант, который не заработает. Каким бы спосбом вы не пытались выполнить запрос на БД (ExecuteNonQuery, ExecuteReader или ExecuteScalar), все равно появится ошибка,потому что DataReader будет открыт. А запрос к БД нужно делать на каждой итерации, которая удовлетворяет условиям. При такой реализации вам нужно выгружать данные в DataTable, и циклом перебирать значения DataTable, а не DataReader.
0
Fitprog
3 / 3 / 0
Регистрация: 05.05.2013
Сообщений: 73
01.07.2014, 10:08  [ТС] 17
О Боже.... А как с ним работать ?Ищу что то ничего подходящего нет....это получается не визуальный элемент?
0
01.07.2014, 10:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2014, 10:08

Как правильно сформировать запрос?
У меня есть некая таблица со столбцами ID и Name. Есть запрос (строка для него, точнее), успешно...

Как правильно записать значения в БД SQL
Немного не догоняю с записью в SQL. Создал форму, в ней вводятся значения ну и хотелось бы записать...

Как правильно создать Between запрос Mysql
Доброго времени суток, подскажите как правильно создать запрос на Mysql string MySelect =...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru