2012-04-16 12 views
9

Mam SqlDataSource, Gridview i DropDownList na tej samej stronie. Wybór DropDownList jest powiązany z zestawem SelectCommands, UpdateCommands i DeleteCommands, dzięki czemu mogę skorzystać z mechanizmu GridView AutoGenerateEditButton = "true" i 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(); 
} 

Jak lub w jakim punkcie muszę dodać parametry? Czy to jest automatyczne? Po prostu chcę tylko możliwość aktualizacji i usuwania kolumn z tabeli. Chcę to wszystko zrobić w pliku .cs, w przeciwieństwie do pliku .aspx, ponieważ chciałbym go w końcu uczynić bardziej dynamicznym; ale na razie chcę tylko podstawy. Podejrzewam, że mogę mieć logikę DataBind() w nieodpowiednim zdarzeniu, ponieważ nie w pełni rozumiem kolejność zdarzeń związanych z powiązaniem danych.

Zapytania nie są skomplikowane i nie zawierają żadnych sprzężeń ani widoków; są to proste WYBIERANIA w pojedynczych tabelach.

+0

Istnieje wbudowany szablon o nazwie Dane dynamiczne, dostarczany z ASP.Netto out-of-the-box, który ogólnie zapewnia możliwość przeglądania, aktualizacji, edycji i usuwania rekordów z dowolnej tabeli w źródle danych. Możesz także dostosować indywidualne strony, indywidualne działania, typy pól itp. Więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb

+0

Czy brałeś pod uwagę przy użyciu 'LinqDataSource' i LINQ-To-SQL/etc. do pracy z bazą danych? Może być o wiele łatwiejsze, ponieważ automatycznie obsługuje on selekcje/inserty/aktualizacje. – mellamokb

+0

Nawet jeśli nie używasz danych dynamicznych, może nie być złym pomysłem przejrzenie części kodu źródłowego, jak to działa, aby uzyskać pomysły na uproszczenie kodu i skorzystanie z wbudowanych narzędzi do generowania instrukcji SQL itp. Tego typu rzeczy zostały już wiele razy zrobione i jest o wiele łatwiej i znacznie trudniej to zrobić w zależności od tego, jak sobie z tym poradzisz. – mellamokb

Odpowiedz

10

Edit: wydaje się, że jeśli używasz AutoGenerateColumns = „true” na GridView i wypełnić poprzez SqlDataSource, zostanie ona automatycznie powiązać wartości kontroli wg nazwy do odpowiednich parametrów w zapytaniu SQL bez żadnych dodatkowych kod. Jednak musimy użyć GetInsertCommand(true) itp tak, że polecenia używać nazwy kolumn (patrz poniższy kod gdzie mogę pokazać, jak korzystać SqlCommandBuilder Istnieje kilka pułapek, jednak jak odkryłam w testowaniu.

  • Musisz ustawić DataKeyNames swojego GridView
  • Musisz ustawić OldValuesParameterFormatString="Original_{0}" na swoim SQLDS.
  • Musisz scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges; na swój SqlCommandBuilder jeśli chcesz po prostu zaktualizować bez porównywania starych wartości.
  • It wydaje się, że jeśli wypełniasz Wybierz/Aktualizuj/Usuń eCommand na SqlDataSource programowo, musisz to zrobić na każdym odświeżeniu.

Jednak w przypadku trzeba dostosować, kontrola SqlDataSource zapewnia wydarzenia Inserting, Updating, Deleting, które można użyć do wypełnienia parametrów przed działania SQL są zrobione na bazie:

sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating); 

protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    e.Command.Parameters["@Name"].Value = // retrieve value from user entry 
} 

To samo można zrobić w zdarzeniach Inserting i Deleting za pośrednictwem dostępu e.Command.Parameters[...].


pamiętać, że można również generować odpowiednią komendę/Insert/Update, Delete automatycznie przy użyciu klasy SqlCommandBuilder tak, że nie trzeba budować gigantyczną switch zawierający wszystkich stołach. Oto przykład:

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; 

Będzie to oczywiście wymagać, że wszystkie tabele mają klucze podstawowe, które mogą być użyte do wygenerowania odpowiedniej aktualizacji i usuwania oświadczenia. Jeśli nie, otrzymasz wyjątek dotyczący dynamicznego generowania kodu SQL. Nawet jeśli nie podoba ci się ta metoda ze względu na czas wykonywania wyszukiwania schematu w silniku bazy danych, zawsze możesz wstępnie wygenerować je wszystkie za pomocą szablonu T4, zamiast wpisywać je wszystkie ręcznie.

+1

Dziękuję bardzo! Część .GetInsertCommand (true) z SqlCommandBuilder była tym, czego mi brakowało. Dynamicznie generowałem łańcuch zamiast polecenia! Planuję także w końcu używać LinqDataSource, ale teraz tylko część mojego kodu używa Linq; Trwa proces aktualizacji. Dzięki jeszcze raz! – Mark