Member 14947303 Ответов: 1

Как вставить данные в две таблицы с одинаковым идентификатором(1:m)?


Всем привет.
Я пытаюсь сохранить данные в двух таблицах. Таблица 1 будет обрабатывать общие данные( дата, кассир, итого), а таблица 2-подробные данные( например, pname, pqty, pprice).
Я пытаюсь сохранить эти данные в двух таблицах с одинаковым идентификатором. На данный момент я храню данные таким образом:



Но главная проблема снизу кода заключается в том, что номер счета( NR_F) хранится через код, а не автоматически, что не является отличным вариантом( из-за клонфликтных данных на dba)
Я использовал поле ID( autonumber, Identity(1,1)). но идентификатор не тот же самый. Сколько бы продукта я ни вставил , столько же ID будет предоставлено( и там,где я хочу вызвать эти данные, я не могу позвонить по id из-за большого количества вставленных id).
Главный вопрос заключается в том, как вставить только одну строку в таблицу 1(дата, сумма, кассир) и несколько строк в таблицу 2 (Сведения о продукте), связанных друг с другом номером счета(NR_F))

Что я уже пробовал:

{
           conn.Open();


           foreach (DataGridViewRow row in dtgprofatura.Rows)
           {
               if (!row.IsNewRow)
               {
                   SqlCommand cmd = new SqlCommand("insertprofatura", conn);
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.Parameters.Clear();
                   cmd.Parameters.Add(new SqlParameter("@shenime", txtshenimi.Text));
                   cmd.Parameters.Add(new SqlParameter("@data", DateTime.Now));
                   cmd.Parameters.Add(new SqlParameter("@kasieri", lbluser.Text));
                   cmd.Parameters.Add(new SqlParameter("@NR_F", int.Parse(lblidfatura.Text)));
                   cmd.Parameters.Add(new SqlParameter("@emri_sh", lblshitesiemri.Text));
                   cmd.Parameters.Add(new SqlParameter("@niptsh", int.Parse(lblshitesinipt.Text)));
                   cmd.Parameters.Add(new SqlParameter("@adresash", lbladresashitesi.Text));
                   cmd.Parameters.Add(new SqlParameter("@telefonish", lblshitesitelefon.Text));
                   cmd.Parameters.Add(new SqlParameter("@emri_b", cmbbleresi.Text));
                   cmd.Parameters.Add(new SqlParameter("@niptb", lblbleresinipt.Text));
                   cmd.Parameters.Add(new SqlParameter("@adresab", lblbleresiadresa.Text));
                   cmd.Parameters.Add(new SqlParameter("@telefonib", lblbleresitelefoni.Text));
                   cmd.Parameters.Add(new SqlParameter("@nentotali", lblnentotali.Text));
                   cmd.Parameters.Add(new SqlParameter("@vleratvsh", lblvleratvsh.Text));
                   cmd.Parameters.Add(new SqlParameter("@zbritja", txtzbritja.Text));
                   cmd.Parameters.Add(new SqlParameter("@totali", lbltotali.Text));
                   cmd.Parameters.Add(new SqlParameter("@barkodi", row.Cells[0].Value));
                   cmd.Parameters.Add(new SqlParameter("@emertimi", row.Cells[1].Value));
                   cmd.Parameters.Add(new SqlParameter("@sasia", row.Cells[3].Value));
                   cmd.Parameters.Add(new SqlParameter("@cmimi", row.Cells[2].Value));
                   cmd.Parameters.Add(new SqlParameter("@totaliPCS", row.Cells[5].Value));
                   cmd.Parameters.Add(new SqlParameter("@tvsh", row.Cells[4].Value));
                   cmd.Parameters.Add(new SqlParameter("@vleratvshpcs", row.Cells[7].Value));
                   cmd.Parameters.Add(new SqlParameter("@patvshpcs", row.Cells[6].Value));
                   cmd.ExecuteNonQuery();

               }
           }
       }
       catch (Exception ex)
       {
           MessageBox.Show("Procedimi i profatures deshtoi " + ex.ToString());
       }
       finally
       {
           conn.Close();
           clear();
           kRIJOToolStripMenuItem.PerformClick();
       }
и SP используемый для вставки:
ALTER procedure [dbo].[insertprofatura]
        @shenime varchar(max),
        @data datetime,
        @kasieri varchar(50),
        @NR_F int,
        @emri_sh varchar(50),
        @niptsh varchar(50),
        @adresash varchar(100),
        @telefonish varchar(50),
        @emri_b varchar(50),
        @niptb varchar(50),
        @adresab varchar(100),
        @telefonib varchar(50),
        @nentotali float,
        @zbritja float,
        @vleratvsh float,
        @totali float,
        @barkodi int,
        @emertimi varchar(200),
        @sasia int, 
        @cmimi float,
        @totaliPCS float,
        @tvsh float,
        @vleratvshpcs float,
        @patvshpcs float

        as

        insert into tblprofatura         (NR_F,Shenime,Data,Kasieri,Emri_sh,NIPT_sh,Adresa_sh,Telefoni_sh,Emri_b,NIPT_b,Adresa_b,Telefoni_b,Nentot        ali,Zbritja,VleraTVSH,Totali)
			        values(@NR_F,@shenime,@data,@kasieri,@emri_sh,@niptsh,@adresash,@telefonish,@emri_b,@niptb,@adresab,@telefonib,@nentotali,@zbritja,@vleratvsh,@totali)
        insert into tblproofatura_details(NR_F,Barkodi,Emertimi,Cmimi,Sasia,TVSH,Totali,PaTVSHpcs,VleraTVSHpcs)
        values (@NR_F,@barkodi,@emertimi,@cmimi,@sasia,@tvsh,@totaliPCS,@patvshpcs,@vleratvsh)

1 Ответов

Рейтинг:
1

CHill60

Сначала вставьте в свою tblprofatura, а затем захватите сгенерированный идентификатор с помощью Функция scope_identity[^].
Затем вставьте подробную информацию в tblproofatura_details с захваченным идентификатором

Вот упрощенный пример:

declare @master table (masterId int identity(1,1), MasterSummary nvarchar(20));
declare @lastId int;
insert into @master (MasterSummary) values ('Testing1')
set @lastId = SCOPE_IDENTITY();

declare @detail table(myId int identity(1,1), fk_to_master int, myDetail nvarchar(255))
insert into @detail (fk_to_master, myDetail) values (@lastId, 'Test details 1');
insert into @detail (fk_to_master, myDetail) values (@lastId, 'Test details 2');
select * from @master
select * from @detail
что и дает результаты
masterId	mastersummary
1		Testing1
и
myId	fk_to_master	myDetail
1		1		Test details 1
2		1		Test details 2


Member 14947303

спасибо тебе @CHill60

CHill60

С удовольствием

Member 14947303

Я использую этот код СП,

Изменить процедуру [dbo].[insertimi]

@shenime varchar(Макс),
@data datetime,
@kasieri varchar(50),
@emri_sh varchar(50),
@niptsh varchar(50),
@adresash varchar(100),
@telefonish varchar(50),
@emri_b varchar(50),
@niptb varchar(50),
@adresab varchar(100),
@telefonib varchar(50),
@nentotali поплавок,
@zbritja поплавок,
@поплавок vleratvsh ,
@totali float,
@barkodi int,
@emertimi varchar(200),
@sasia int,
@поплавок cmimi ,
@totaliPCS поплавок,
@поплавок твш ,
@vleratvshpcs поплавок,
@patvshpcs поплавок
как


объявить @lastId int;
вставить в tblprofatura (Shenime,Data,Kasieri,Emri_sh,NIPT_sh,Adresa_sh,Telefoni_sh,Emri_b,NIPT_b,Adresa_b,Telefoni_b,Nentotali,Zbritja,VleraTVSH,Totali)
values(@shenime,@data,@kasieri,@emri_sh,@niptsh,@adresash,@telefonish,@emri_b,@niptb,@adresab,@telefonib,@nentotali,@zbritja,@vleratvsh,@totali)
set @lastId = SCOPE_IDENTITY();


вставить в tblproofatura_details(NR_F,Barkodi,Emertimi,Cmimi,Sasia,TVSH,Totali,PaTVSHpcs,VleraTVSHpcs)
значения (@lastId,@barkodi,@emertimi,@cmimi,@sasia,@tvsh,@totaliPCS,@patvshpcs,@vleratvsh)

Но теперь в мою родительскую таблицу, например, вставляются три строки с разными идентификаторами, а в мою дочернюю таблицу не вставляется ни одна строка. Я хочу, чтобы в моей родительской таблице была вставлена одна строка с общими данными, а в моей дочерней таблице было столько строк, сколько нужно, связанных с родительским идентификатором

CHill60

Глядя на свой код C#, вы вызываете SP для каждой строки в dtgprofatura - возможно, вам следует вставить нужные данные в tblprofatura с одним SP, который возвращает идентификатор, а затем в цикле вызвать SP, который записывает подробные строки.