Due insert insieme

lunedì 06 agosto 2007 - 09.33

_J_ Profilo | Senior Member

ciao ragazzi,

dovrei fare una operazione di questo tipo:

ho tre tabelle: 'cittadino'e 'nucleo familiare' collegate mediante la tabella 'appartiene'.
i campi sono (ne elenco solo alcuni):

cittadino
-------------
cod_persona
cognome
nome

appartiene
----------------
cod_persona
cod_nf
data_inserimento

nucleo familiare
--------------------
cod_nf
tipo_nf


ho realizzato alcune insert nel caso di nuovo cittadino o nuova famiglia 'separatamente', nel senso che i nuovi record che inserisco nella tabella 'cittadino' trattano il caso di cittadini che non appartengono ad alcuna famiglia, e i recod che inserisco nella tabella
'nucleo familiare' trattano il caso di famiglie che non hanno componenti.. devo infatti modificare la tabella 'appartiene' se voglio abbinare cittadini e famiglie...

quello che voglio fare io è creare una nuova famiglia direttamente mediante la creazione del cittadino, cioè sarebbe una insert su 'cittadino' + una insert su 'appartiene'

il problema è che non saprei come gestire la query, cioè come imporre a 'appartiene'. 'cod_persona' il valore appena creato di 'cittadino'.cod_persona'

non so se mi sono spiegato bene, spero di sì..
qualcuno di voi potrebbe aiutarmi?

_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

alx_81 Profilo | Guru

>ciao ragazzi,
Ciao!
>
>dovrei fare una operazione di questo tipo:
>ho tre tabelle: 'cittadino'e 'nucleo familiare' collegate mediante
>la tabella 'appartiene'.
>i campi sono (ne elenco solo alcuni):
>
>cittadino
>-------------
>cod_persona
>cognome
>nome
>
>appartiene
>----------------
>cod_persona
>cod_nf
>data_inserimento
>
>nucleo familiare
>--------------------
>cod_nf
>tipo_nf
>
>
>ho realizzato alcune insert nel caso di nuovo cittadino o nuova
>famiglia 'separatamente', nel senso che i nuovi record che inserisco
>nella tabella 'cittadino' trattano il caso di cittadini che non
>appartengono ad alcuna famiglia, e i recod che inserisco nella
>tabella 'nucleo familiare' trattano il caso di famiglie che non hanno
>componenti.. devo infatti modificare la tabella 'appartiene'
>se voglio abbinare cittadini e famiglie...
>quello che voglio fare io è creare una nuova famiglia direttamente
>mediante la creazione del cittadino, cioè sarebbe una insert
>su 'cittadino' + una insert su 'appartiene'
>il problema è che non saprei come gestire la query, cioè come
>imporre a 'appartiene'. 'cod_persona' il valore appena creato
>di 'cittadino'.cod_persona'
Ti devi scrivere una stored procedure che fa tutto quello che ti serve..
di che tipo è il campo cod_persona? è identity?
se sì, puoi usare nella stored la funzione SCOPE_IDENTITY() per capire l'ultimo id inserito ed usarlo nella insert successiva.

>
>_J_
>
>"Chi fa domande rischia di sembrare stupido,
>chi non ne fa rischia di restare stupido..."
>
>"Conosco me stesso? No, non parlo con gli estranei..."

Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

ciao alx!
purtroppo il campo cod_persona non è identity.. in questo caso ci sarebbe qc altra soluzione o l'identity devo farlo per forza?

cmq la stored di base sarebbe questa:

create PROCEDURE ins_nuovo_citt_in_nuova_fam
(
@cod_p_citt int,
@cognome varchar(30),
@nome varchar(30),
@cod_p_appartiene int,
@cod_nf int,
@data_ins datetime
)

AS

insert into cittadino
( cod_persona,
cognome,
nome
)
values
(
@cod_p_citt,
@cognome,
@nome
)

insert into appartiene
(
cod_persona,
cod_nucleo_familiare,
data_inserimento_in_nf_conv
)
values
(
@cod_p_appartiene,
@cod_nf,
@data_ins
)

RETURN

a parte lo scope_identity(), è corretta?

_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

alx_81 Profilo | Guru

>ciao alx!
>purtroppo il campo cod_persona non è identity.. in questo caso
>ci sarebbe qc altra soluzione o l'identity devo farlo per forza?
ma non puoi usare lo stesso parametro che usi per la prima insert?
se deve essere lo stesso valore.. non vedo il problema..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

posso farlo? non l'ho fatto perchè credevo ci sarebbero stati problemi di tempistica tra le due insert!
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

alx_81 Profilo | Guru

>posso farlo? non l'ho fatto perchè credevo ci sarebbero stati
>problemi di tempistica tra le due insert!
no.. sono una dopo l'altra
>_J_
>
>"Chi fa domande rischia di sembrare stupido,
>chi non ne fa rischia di restare stupido..."
>
>"Conosco me stesso? No, non parlo con gli estranei..."

Alx81 =)

http://blogs.dotnethell.it/suxstellino

_J_ Profilo | Senior Member

allora, quello dei due insert che ho postato era uno schema per capire come dovessi gestire certe situazioni, ma ora che ho provato ad usarlo nella realtà sto incontrando problemi.
la stored che uso è questa:

ALTER PROCEDURE dbo.nuova_fam_da_nuovo_cittadino
(
@cod_nf int,
@data_c datetime, /*lo uso per entrambe le date di inserimento nelle due diverse tabelle
@tipo int,
@data_s datetime,

@ultimo_ind int,

@cod_p int,
@cod_parent int,
@data_r datetime,
@cond varchar(1)
)
AS
INSERT INTO nucleo_fam_e_convivenze //prima creo la famiglia
(
cod_nucleo_familiare,
data_creazione, //uso @data_c
tipo_nucleo,
data_scissione
)
VALUES (@cod_nf,@data_c,@tipo,@data_s)


set @ultimo_ind=scope_identity() /*per l'indice nel ruolo_in_nf_o_conviv*/



insert ruolo_in_nf_o_conviv //e poi ci inserisco il cittadino appena creato
(
cod_persona,
cod_nucleo_familiare , //uso @ultimo_ind per abbinare al cittadino appena creato la famiglia nuova che si sta creando
cod_parentela_con_is_o_cc,
data_inserimento_in_nf_conv, //uso @data_c
data_rimoz_da_nf_conv,
condizione_in_nf_conv
)
values (@cod_p,@ultimo_ind, @cod_parent, @data_c,@data_r,@cond)
return



ma a runtime mi dice 'formato della stringa di input non corretto', e penso che la colpa sia di @ultimo_ind (quello dello scope_identity) che tra i parametri NON dichiaro (sinceramente non sapre da dove prenderlo visto che con scope_identity dovrebbe farlo lui), infatti nel file c# i parametri sono:

SqlDataAdapter adatt = new SqlDataAdapter(tutti, oConn);
adatt.SelectCommand.CommandType = CommandType.StoredProcedure;
adatt.SelectCommand.Parameters.Add(new SqlParameter("@cod_nf", SqlDbType.Int));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@data_c", SqlDbType.DateTime));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@tipo", SqlDbType.Int));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@data_s", SqlDbType.DateTime));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@cod_p", SqlDbType.Int));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@cod_parent", SqlDbType.Int));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@data_r", SqlDbType.DateTime));
adatt.SelectCommand.Parameters.Add(new SqlParameter("@cond", SqlDbType.VarChar, 1));

adatt.SelectCommand.Parameters["@cod_nf"].Value = Server.HtmlEncode(TextBox35.Text);
adatt.SelectCommand.Parameters["@data_c"].Value = DateTime.Now;
adatt.SelectCommand.Parameters["@tipo"].Value = Server.HtmlEncode(Label5.Text);
adatt.SelectCommand.Parameters["@data_s"].Value = DBNull.Value;
adatt.SelectCommand.Parameters["@cod_p"].Value = Server.HtmlEncode(TextBox1.Text);
adatt.SelectCommand.Parameters["@cod_parent"].Value = "IS";
adatt.SelectCommand.Parameters["@data_r"].Value = DBNull.Value;
adatt.SelectCommand.Parameters["@cond"].Value = Server.HtmlEncode(Label4.Text);

adatt.SelectCommand.ExecuteNonQuery();
oConn.Close();

cosa posso fare?
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

nullatore Profilo | Junior Member

[occhio _J_ che questa tematica è piu' consona ad una area del tipo SQL (http://www.dotnethell.it/forum/SQL-Server-MySQL-Access.aspx)]

Ciao
~nullatore~
mai dire corto circuito virtuale

_J_ Profilo | Senior Member

ok, proverò ad esporre il mio problema nel topic che mi hai suggerito tu
graaassssie
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."

_J_ Profilo | Senior Member

il problema è stato risolto ()... a chi interessasse ecco il link del thread:

http://www.dotnethell.it/forum/messages.aspx?ThreadID=17227

ciao!
_J_

"Chi fa domande rischia di sembrare stupido,
chi non ne fa rischia di restare stupido..."

"Conosco me stesso? No, non parlo con gli estranei..."
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5