Edit: E sembra che se si usa AutoGenerateColumns = "true" sul GridView e popolare via SqlDataSource, si legherà automaticamente i valori dei controlli per nome per i parametri appropriati nella query SQL, senza alcun extra codice. Tuttavia, dobbiamo usare GetInsertCommand(true)
, ecc in modo che i comandi utilizzano i nomi delle colonne (vedi codice qui sotto dove mostro come usare SqlCommandBuilder
Ci sono un paio di grattacapi, tuttavia, come ho scoperto in fase di test:.
- È necessario impostare la
DataKeyNames
del GridView
- Avrai bisogno di impostare
OldValuesParameterFormatString="Original_{0}"
sui vostri sqlDS.
- Avrete bisogno
scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
sul tuo SqlCommandBuilder
se si desidera aggiornare solo senza confrontarlo vecchi valori.
- E ' sembra che se stai popolando Seleziona/Aggiorna/Elimina eCommand su SqlDataSource a livello di codice, devi farlo su ogni postback.
Tuttavia, nel caso in cui è necessario personalizzare, il controllo SqlDataSource
fornisce gli eventi Inserting
, Updating
, Deleting
che è possibile utilizzare per popolare i parametri prima delle azioni SQL vengono prese sulla base di dati:
sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating);
protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@Name"].Value = // retrieve value from user entry
}
Lo stesso tipo di operazione può essere eseguita negli eventi Inserting
e Deleting
tramite l'accesso e.Command.Parameters[...]
.
Si noti che è anche possibile generare il comando/Inserisci/Aggiorna Elimina adeguato automaticamente utilizzando la classe SqlCommandBuilder
in modo che non si deve costruire un'istruzione switch gigante contenente tutte le tabelle. Ecco un esempio:
string tableName = ddl.SelectedValue;
string connectionString = ConfigurationManager
.ConnectionStrings["MyConnectionString"].ConnectionString;
string select = "SELECT * FROM [" + tableName + "]";
SqlDataAdapter sda = new SqlDataAdapter(select, connection);
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sqlDS.SelectCommand = select;
sqlDS.InsertCommand = scb.GetInsertCommand(true).CommandText;
sqlDS.UpdateCommand = scb.GetUpdateCommand(true).CommandText;
sqlDS.DeleteCommand = scb.GetDeleteCommand(true).CommandText;
Ovviamente questo richiede che tutte le tabelle hanno chiavi primarie che possono essere utilizzati per generare l'aggiornamento in questione e DELETE. In caso contrario, si otterrà un'eccezione sulla generazione dinamica di SQL. Anche se non ti piace questo metodo a causa del costo in fase di esecuzione della ricerca dello schema sul motore del database, puoi sempre pre-generarli tutti con un modello T4 invece di digitarli tutti a mano.
Esiste un modello incorporato denominato Dati dinamici fornito con ASP.Net out-of-the-box che offre genericamente la possibilità di visualizzare, aggiornare, modificare ed eliminare i record da qualsiasi tabella in un'origine dati. Puoi anche personalizzare singole pagine, singole azioni, tipi di campi, ecc. Vedi maggiori informazioni qui: http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb
Hai considerato usando 'LinqDataSource' e LINQ-To-SQL/etc. per lavorare con il tuo database? Può essere molto più semplice perché gestisce l'impianto idraulico per selezionare/inserisce/aggiorna automaticamente. – mellamokb
Anche se non si utilizzano i dati dinamici, potrebbe non essere una cattiva idea rivedere parte del codice sorgente di come funziona per ottenere idee su come semplificare il codice e sfruttare gli strumenti incorporati per generare istruzioni SQL , ecc. Questo tipo di cose sono state fatte molte volte in passato, e ci sono modi molto più semplici e molto più difficili di farlo a seconda di come lo si fa. – mellamokb