2012-04-16 14 views
9

Ho una SqlDataSource, una Gridview e una DropDownList sulla stessa pagina. La selezione DropDownList è associata a un set di SelectCommands, UpdateCommands e DeleteCommands, in modo che sia possibile sfruttare il meccanismo GridView AutoGenerateEditButton = "true" e AutoGenerateUpdateButton = "true".SqlDataSource Code Behind Event Order

Page_Load 
{ 
    switch(ddl.SelectedItem.Text) 
    { 
    case "A": 
     sqlDS.SelectCommand = "Select * From A"; 
     sqlDS.UpdateCommand = "Update A Set Name = @Name WHERE ID = @ID"; 
     sqlDS.DeleteCommand = "Delete A WHERE ID = @ID"; 
     break; 
    ... 
    } 

    sqlDS.DataBind(); 
    grd.DataSourceID = sqlDS.ID; 
    grd.DataBind(); 
} 

Come o in quale punto è necessario aggiungere i parametri? È automatico? Fondamentalmente voglio solo la possibilità di aggiornare ed eliminare le colonne da una tabella. Voglio fare tutto questo nel vero file .cs, invece che nel file .aspx, perché mi piacerebbe renderlo più dinamico alla fine; ma per ora voglio solo ottenere le basi. Ho il sospetto che possa avere la logica DataBind() nell'evento inappropriato perché non comprendo completamente l'ordine degli eventi associati all'associazione dati.

Le query non sono complicate e non comportano join o visualizzazioni; sono semplici SELECT su singole tabelle.

+0

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

+0

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

+0

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

risposta

10

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.

+1

Grazie mille! La parte .GetInsertCommand (true) di SqlCommandBuilder era ciò che mi mancava. Stavo generando dinamicamente una stringa invece di un comando! Pianifico anche sull'uso di LinqDataSource, ma al momento solo una parte del mio codice usa Linq; Sono in fase di aggiornamento però. Grazie ancora! – Mark

Problemi correlati