2011-09-02 20 views
6

Vorrei sapere qual è il/modo migliore standard di fare quanto segue:inserimento di dati in più tabelle utilizzando un modulo web

ho un app modulo web in asp.net e l'utilizzo di C#

l'utente inserirà i dati nel modulo e farà clic su INSERISCI e inserirà i dati in 4 diverse tabelle.

i campi sono:

primarykey, animal, street, country 

forma permette per gli animali più, le strade più e più paesi per PrimaryKey. così quando ho dati in questo modo:

[1],[rhino,cat,dog],[luigi st, paul st], [russia,israel] 

ho bisogno inserito nelle tabelle in questo modo:

table1: 
1,rhino 
1,cat 
1,dog 

table2: 
1,luigi st 
1, paul st 

table3: 
1,russia 
1,israel 

domande

  1. Sono ad una perdita totale su come per fare questo. se avessi solo una tabella e un set di dati per chiave primaria, userei semplicemente InsertQuery e lo farò in questo modo, ma dal momento che sono tabelle multiple non so come farlo ??

  2. quale controllo devo usare per consentire all'utente di inserire più valori? attualmente sto usando solo le caselle di testo e sto pensando di separare le voci da semi-punto, ma probabilmente non è la strada giusta.

+0

Per (1): è possibile utilizzare una transazione. Vedi questa risposta: http://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005/2044520#2044520 –

risposta

3

volevo consigliamo di sfruttare la nuova dichiarazione dell'inserto multirow in SQL 2008 in modo che si può semplicemente passare un'istruzione SQL come questo:

INSERT INTO table1(id,animal_name) values (1,cat),(1,dog),(1,horse)... 

Per il tuo SqlCommand ma io don' so come costruire una dichiarazione del genere senza rischiare di essere vittima di un attacco SQL Injection.

Un'altra alternativa è quella di definire i tipi di tabella i dati nel database sql: enter image description here

enter image description here

E poi costruire una DataTable in C# che corrisponde alla tua definizione di tipo DataTable:

DataTable t = new DataTable(); 
t.Columns.Add("id"); 
t.Columns.Add("animal_name"); 
foreach(var element in your animals_list) 
{ 
    DaraRow r = t.NewRow(); 
    r.ItemArray = new object[] { element.id, element.animal_name }; 
    t.Rows.Add(r); 
} 

// Assumes connection is an open SqlConnection. 
using (connection) 
{ 
    // Define the INSERT-SELECT statement. 
    string sqlInsert = "INSERT INTO dbo.table1 (id, animal_name) SELECT nc.id, nc.animal_name FROM @animals AS nc;" 

    // Configure the command and parameter. 
    SqlCommand insertCommand = new SqlCommand(sqlInsert, connection); 
    SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@animals", t); 
    tvpParam.SqlDbType = SqlDbType.Structured; 
    tvpParam.TypeName = "dbo.AnimalTable"; 

    // Execute the command. 
    insertCommand.ExecuteNonQuery(); 
} 

Read more here .

Oppure, se si ha familiarità con le stored procedure, come per il suggerimento precedente, ma se la stored procedure riceve il DataTable t come parametro.

Se nessuno dei suddetti lavori per voi, creare una SqlTranscation dall'oggetto Connection e scorrere ogni riga di ciascun set di dati inserendo il record nella tabella appropriata e infine impegnare la transazione. Example here.

+0

grazie mille dove vorrei posto quel codice? nell'evento INSERTING? –

2

Utilizzare caselle di controllo sul front-end. Avere un servizio/repository per salvare i dati dell'utente.Qualcosa di simile a quanto segue:

public void UpdateUserAnimals(Guid userId, string[] animals) 
{ 
    using (SqlConnection conn = new SqlConnection("connectionstring...")) 
    { 
     using (SqlCommand cmd = new SqlCommand("Insert Into UserAnimals(UserId, Animals) values (@UserId, @Animal)")) 
     { 
      conn.Open(); 
      cmd.Parameters.AddWithValue("@UserId", userId); 
      foreach(string animal in animals) 
      { 
       cmd.Parameters.AddWithValue("@Animal", animal); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 

Ci sono soluzioni più complesse, ma questo è un semplice.

+0

bella risposta ci proverò –

Problemi correlati