Edit: Это действительно кажется, что если вы используете AutoGenerateColumns = «истинный» на GridView и заполнить с помощью SqlDataSource, он будет автоматически связывать значения элементов управления по имени соответствующих параметров в запросе SQL без каких-либо дополнительных код. Тем не менее, мы должны использовать GetInsertCommand(true)
и т.д., так что команды используют имена столбцов (см ниже код, где я покажу, как использовать SqlCommandBuilder
Есть несколько моментов, однако, как я обнаружил в тестировании:.
- вы должны установить
DataKeyNames
вашего GridView
- Вам нужно установить
OldValuesParameterFormatString="Original_{0}"
на ваших SQLDS.
- Вам нужно
scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
на вашем SqlCommandBuilder
если вы хотите просто обновить, не сравнивая старые значения.
- It что если вы заполняете Select/Update/Delet eCommand на SqlDataSource программно, вы должны сделать это при каждой обратной передаче.
Однако, в случае, если вам нужно настроить, управление SqlDataSource
обеспечивает события Inserting
, Updating
, Deleting
, которые вы можете использовать для заполнения параметров перед действием SQL принимаются на базе:
sqlDS.Updating += new SqlDataSourceCommandEventHandler(sqlDS_Updating);
protected void sqlDS_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@Name"].Value = // retrieve value from user entry
}
То же самое можно сделать в событиях Inserting
и Deleting
через доступ к e.Command.Parameters[...]
.
Обратите внимание, что вы можете также генерировать соответствующую команду Delete/Insert/Update автоматически с помощью SqlCommandBuilder
класс, так что вам не придется строить гигантский о переключатель, содержащий все ваши таблицы. Вот пример:
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;
Это, конечно, требует, чтобы все ваши таблицы имеют первичные ключи, которые могут быть использованы для создания соответствующего обновления и удаления заявления. Если нет, вы получите исключение из динамической генерации SQL. Даже если вам не нравится этот метод из-за затрат времени на просмотр схемы на движке базы данных, вы всегда можете предварительно сгенерировать их все с помощью шаблона T4, а не вводить их вручную.
Существует встроенный шаблон Dynamic Data, который поставляется с ASP.Net-the-the-box, который в целом обеспечивает возможность просмотра, обновления, редактирования и удаления записей из любой таблицы в источнике данных. Вы также можете настроить отдельные страницы, отдельные действия, типы полей и т. Д. Подробнее см. Здесь: http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb
Считаете ли вы, что используя «LinqDataSource» и LINQ-To-SQL/и т. д. для работы с вашей базой данных? Это может быть намного проще, потому что он автоматически обрабатывает сантехнику для выбора/вставки/обновления. – mellamokb
Даже если вы не используете динамические данные, неплохо было бы рассмотреть некоторые из исходного кода, как это работает, чтобы получить идеи, как упростить код и воспользоваться встроенными инструментами для генерации операторов SQL и т. д. Такие вещи делались много раз раньше, и есть намного более простые и более сложные способы сделать это в зависимости от того, как вы это делаете. – mellamokb