2012-04-16 1 views
9

У меня есть SqlDataSource, Gridview и DropDownList на той же странице. Выбор DropDownList связан с набором SelectCommands, UpdateCommands и DeleteCommands, поэтому я могу воспользоваться механизмом GridView AutoGenerateEditButton = "true" и AutoGenerateUpdateButton = "true".Код SqlDataSource за заказом события

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(); 
} 

Как или в какой момент мне нужно добавить параметры? Автоматически? Я просто хочу иметь возможность обновлять и удалять столбцы из таблицы. Я хочу сделать все это в фактическом файле .cs, а не в файле .aspx, так как я хотел бы сделать его более динамичным; но пока я просто хочу, чтобы основывались. Я подозреваю, что у меня может быть логика DataBind() в несоответствующем случае, потому что я не совсем понимаю порядок событий, связанных с привязкой данных.

Запросы не являются сложными и не предполагают объединения или представления; они простые SELECT над отдельными таблицами.

+0

Существует встроенный шаблон Dynamic Data, который поставляется с ASP.Net-the-the-box, который в целом обеспечивает возможность просмотра, обновления, редактирования и удаления записей из любой таблицы в источнике данных. Вы также можете настроить отдельные страницы, отдельные действия, типы полей и т. Д. Подробнее см. Здесь: http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb

+0

Считаете ли вы, что используя «LinqDataSource» и LINQ-To-SQL/и т. д. для работы с вашей базой данных? Это может быть намного проще, потому что он автоматически обрабатывает сантехнику для выбора/вставки/обновления. – mellamokb

+0

Даже если вы не используете динамические данные, неплохо было бы рассмотреть некоторые из исходного кода, как это работает, чтобы получить идеи, как упростить код и воспользоваться встроенными инструментами для генерации операторов SQL и т. д. Такие вещи делались много раз раньше, и есть намного более простые и более сложные способы сделать это в зависимости от того, как вы это делаете. – mellamokb

ответ

10

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, а не вводить их вручную.

+1

Большое вам спасибо! Часть .GetInsertCommand (true) из SqlCommandBuilder была тем, что мне не хватало. Я динамически генерировал строку вместо команды! Я также планирую использовать LinqDataSource в конце концов, но сейчас только часть моего кода использует Linq; Тем не менее, я обновляю его. Еще раз спасибо! – Mark

Смежные вопросы