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.
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
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
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