Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
1
MS SQL

Передать во второй запрос значение id, сгенерированное при выполнении первого запроса insert

19.08.2016, 22:24. Показов 1743. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
две таблицы ... 1 таблицаLOGIN имеет логины и пароли + Id с типом uniqueidentifier и имеет(newid).
id вторая TECHER имена фамилии итд... итп... (и так как соединена с первой таблицей) login_id...
и через форму есть регистрация но при регистрации 1 учителя с логином паролем фамилией имением итд.. нужно чтобы в login_id(в таблице TECHER) добавлялось id (из таблице LOGIN) чтобы соединялось...
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
   public partial class reg : Form
    {
        SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=D:\Program Files\test c#\1\WindowsFormsApplication1\WindowsFormsApplication1\Data.mdf;Integrated Security=True;Connect Timeout=30;");
        public reg()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            con.Open();
            SqlDataAdapter sda = new SqlDataAdapter("insert into LOGIN (login,pasword)values('" + textBox1.Text + "','" + textBox2.Text + "')", con);
            sda.SelectCommand.ExecuteNonQuery();
            con.Close();
            
            con.Open();
            SqlDataAdapter sdaa = new SqlDataAdapter("insert into TECHER (Id,f_t,n_t)values('?????????','" + textBox3.Text + "','" + textBox4.Text + "')", con);
            sdaa.SelectCommand.ExecuteNonQuery();
            con.Close();
 
            MessageBox.Show("Регестрация прошла успешно");
            this.Hide();
            authentication aa = new authentication();
            aa.Show();
        }
       public static void main(string[] args)
       {
           Application.Run(new reg());
       }
 
       private void reg_Load(object sender, EventArgs e)
       {
 
       }
    }
там скорее всего нужно как то через переменную но я даже не знаю как... помогите пожалуйста
где вопросы я не знаю что там написать ....




может заодно скажите как уменьшить код
C#
1
2
3
4
5
6
7
8
9
     con.Open();
            SqlDataAdapter sda = new SqlDataAdapter("insert into LOGIN (login,pasword)values('" + textBox1.Text + "','" + textBox2.Text + "')", con);
            sda.SelectCommand.ExecuteNonQuery();
            con.Close();
            
            con.Open();
            SqlDataAdapter sdaa = new SqlDataAdapter("insert into TECHER (Id,f_t,n_t)values('into LOGIN (Id)','" + textBox3.Text + "','" + textBox4.Text + "')", con);
            sdaa.SelectCommand.ExecuteNonQuery();
            con.Close();
надеюсь всё правильно ...

Добавлено через 18 минут
скорее всего сокращать в этом случае не надо между ними будет присваиваться переменной id .. но если не трудно всё равно напишите интересно как можно сократить ...

Добавлено через 1 минуту
и простите за название не забыл дописать ....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2016, 22:24
Ответы с готовыми решениями:

Программа, переносящая элементы первого массива во второй, при выполнении условия
Программа должна формировать массив y из элементов массива x при выполнении некоторого условия, а...

Запрос параметра при выполнении запроса с вычисляемым полем
Здравствуйте. Есть 2 таблицы в бд на аксесс 2013: 1)НазначенияСотрудникам(код-счетчик...

Как передать значение из функции при асинхронном выполнении
Добрый день, javascript практически не знаю. Помогите, пожалуйста, выполнить следующую задачу: ...

Недопустимое значение с плавающей точкой при выполнении запроса
При нажатии на кнопку выдает ошибку: is not a valid floating point value. помогите разобраться ...

13
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
19.08.2016, 22:48 2
yafidik,
При помощи промежуточного запроса select получайте значение id новой записи и передавайте во второй запрос.
А лучше объедините две таблицы в одну, тогда таких проблем не возникнет.
Это если я правильно понял вопрос.
1
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
19.08.2016, 23:25  [ТС] 3
Даценд, проблема в том что я только начал изучать как с# так и sql ... как запрос выглядеть должен можете помочь ?!
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
19.08.2016, 23:46 4
Лучший ответ Сообщение было отмечено yafidik как решение

Решение

yafidik,
как-то так:
C#
1
2
3
4
5
con.Open();
SqlCommand com = new SqlCommand("select id from LOGIN where login=@login", con);
com.Parameters.AddWithValue("@login", textBox1.Text);
int id = (int)com.ExecuteScalar();
con.Close();
1
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
19.08.2016, 23:59  [ТС] 5
Даценд, я правильно понял ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 con.Open();
 
 
SqlDataAdapter sda = new SqlDataAdapter("insert into LOGIN (login,pasword)values('" + textBox1.Text + "','" + textBox2.Text + "')", con);
sda.SelectCommand.ExecuteNonQuery();
con.Close();
 
SqlCommand com = new SqlCommand("select id from LOGIN where login=@login", con);
com.Parameters.AddWithValue("@login", textBox1.Text);
int id = (int)com.ExecuteScalar();
 
con.Open();
SqlDataAdapter sdaa = new SqlDataAdapter("insert into TECHER (Id,f_t,n_t)values('"+id+"','" + textBox3.Text + "','" + textBox4.Text + "')", con);
sdaa.SelectCommand.ExecuteNonQuery();
con.Close();
если да то вылезает такая ошибка
после
C#
1
 int id = (int)com.ExecuteScalar();
Кликните здесь для просмотра всего текста

System.InvalidOperationException не обработано
HResult=-2146233079
Message=Для ExecuteScalar нужно открытое и доступное подключение Connection. Подключение закрыто.
Source=System.Data
StackTrace:
в System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
в System.Data.SqlClient.SqlCommand.ExecuteScalar()
в WindowsFormsApplication1.reg.button1_Click(Object sender, EventArgs e) в d:\Program Files\test c#\1\WindowsFormsApplication1\WindowsFormsApplication1\reg.cs:строка 33
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNat iveMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в WindowsFormsApplication1.Program.Main() в d:\Program Files\test c#\1\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:строка 19
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
20.08.2016, 00:18 6
Лучший ответ Сообщение было отмечено yafidik как решение

Решение

Не обратил внимания, что поле id здесь uniqueidentifier т.е. Guid.
Приводить результат ExecuteScalar нужно не к int, а к Guid и переменная id должна быть соответствующего типа.
1
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
20.08.2016, 00:32  [ТС] 7
Даценд,ааххахаха проблема с переменной + Id с типом uniqueidentifier(63d68281-e438-4a4f-88ff-26c75e10085a) и имеет(newid). пробовал string bool неработал .... object сработал WTF
правильно :??? и можно ли сократить ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            con.Open();
            
 
            SqlDataAdapter sda = new SqlDataAdapter("insert into LOGIN (login,pasword)values('" + textBox1.Text + "','" + textBox2.Text + "')", con);
            sda.SelectCommand.ExecuteNonQuery();
            SqlCommand comr = new SqlCommand("select id from LOGIN where login=@login", con);
            comr.Parameters.AddWithValue("@login", textBox1.Text);
            object id = (object)comr.ExecuteScalar();
            
            con.Close();
 
           
            con.Open();
            SqlDataAdapter sdaa = new SqlDataAdapter("insert into TACHER (logo_id,f_t,n_t)values('" +id + "','" + textBox3.Text + "','" + textBox4.Text + "')", con);
            sdaa.SelectCommand.ExecuteNonQuery();
            con.Close();
 
            MessageBox.Show("Регестрация прошла успешно");
            this.Hide();
            authentication aa = new authentication();
            aa.Show();
Guid тоже подходит спасибо !!!
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
22.08.2016, 08:50 8
во-первых этот "код"
Цитата Сообщение от yafidik Посмотреть сообщение
SqlDataAdapter sda = new SqlDataAdapter("insert into LOGIN (login,pasword)values('" + textBox1.Text + "','" + textBox2.Text + "')", con);
выкинь на помойку помойку сразу и изучи параметры
а во вторых, изучи предложение OUTPUT для insert
T-SQL
1
insert LOGIN (login,pasword) output inserted.id values .....
и будет счастие
0
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
22.08.2016, 14:15  [ТС] 9
pincet, а что именно не так ? прости я же сказал я новичёк ....а точнее только начал изучать ...
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
22.08.2016, 14:28 10
Цитата Сообщение от pincet Посмотреть сообщение
выкинь на помойку помойку сразу и изучи параметры
что не ясно?
0
Lutd
22.08.2016, 14:43
  #11

Не по теме:

"РегИстрация прошла успешно"

0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
22.08.2016, 14:52 12
yafidik,
в моем сообщении выше есть строки:
C#
1
2
SqlCommand com = new SqlCommand("select id from LOGIN where login=@login", con);
com.Parameters.AddWithValue("@login", textBox1.Text);
В первой строке @login - имя параметра, вместо которого при выполнении запроса будет подставлено значение. Знак '@' обязателен.
Во второй строке к коллекции параметров команды добавляется новый параметр, ему присваивается значение, взятое из textBox1.Text.
При использовании параметров нет необходимости заботиться о кавычках, решетках и других символах, которые нужны при формировании строки запроса вашим способом, т.к. тип параметра определяется автоматически.
0
0 / 0 / 0
Регистрация: 13.10.2014
Сообщений: 13
22.08.2016, 18:02  [ТС] 13
pincet, сорян сам запутал себя .... я кароче думал что тебе не понравился
C#
1
2
SqlCommand com = new SqlCommand("select id from LOGIN where login=@login", con);
com.Parameters.AddWithValue("@login", textBox1.Text);
... моя невнимательность не прочёл ... а так спасибо !!! буду изучать
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
22.08.2016, 18:53 14
Цитата Сообщение от yafidik Посмотреть сообщение
select id from LOGIN where login=@login", con
часть ответа, касающуюся этого, ты тоже не прочел. Зачем лишний SELECT, если есть OUTPUT
0
22.08.2016, 18:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 18:53
Помогаю со студенческими работами здесь

"Не удалось вставить значение NULL в столбец" при выполнении запроса
Добрый вечер. В sql server management studio создала таблицу студент: CREATE TABLE Students (...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru