c# - 事件顺序背后的 SqlDataSource 代码

标签 c# asp.net c#-4.0

我在同一个页面上有一个 SqlDataSource、一个 Gridview 和一个 DropDownList。 DropDownList 选择与一组 SelectCommandsUpdateCommands 和 DeleteCommands 相关联,这样我就可以利用 GridView AutoGenerateEditButton="true"和 AutoGenerateUpdateButton="true"机制.

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() 逻辑,因为我不完全理解与数据绑定(bind)关联的事件顺序。

查询并不复杂,不涉及连接或 View ;它们是对单个表的简单 SELECT。

最佳答案

编辑:如果您在 GridView 上使用 AutoGenerateColumns="true"并通过 SqlDataSource 进行填充,它确实会按名称自动将控件的值绑定(bind)到 SQL 中的适当参数无需任何额外代码的查询。但是,我们必须使用 GetInsertCommand(true) 等,以便命令使用列名(请参阅下面的代码,其中我展示了如何使用 SqlCommandBuilder。有一个很少有陷阱,但是正如我在测试中发现的那样:

  • 您需要设置 GridView 的 DataKeyNames
  • 您需要在您的 sqlDS 上设置 OldValuesParameterFormatString="Original_{0}"
  • 如果您只想更新而不比较旧值,则需要在 SqlCommandBuilder 上使用 scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
  • 看来,如果您以编程方式在 SqlDataSource 上填充 Select/Update/DeleteCommand,则必须在每次回发时执行此操作。

但是,如果您需要自定义,SqlDataSource 控件提供事件 InsertingUpdatingDeleting 在对数据库执行 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
}

同样的事情可以通过 e.Command.Parameters[...]InsertingDeleting 事件中完成访问权限。


请注意,您还可以使用 SqlCommandBuilder 类自动生成适当的 Delete/Insert/Update 命令,这样您就不必构建包含所有表的巨大 switch 语句。这是一个例子:

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 模板预先生成它们,而不是手动输入它们。

关于c# - 事件顺序背后的 SqlDataSource 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168801/

相关文章:

.net - C#/VB .Net 中的代码生成实用程序

c# - 在哪里可以记录 ASP.NET Core 应用程序的启动/停止/错误事件?

C# XmlReader 冒号问题(命名空间)

asp.net - 动画 ListView 页面更改

c# - 我如何使用带有图标的 jquery datepicker 的文本框

.net - 为什么我无法在 .NET 中使用 TBIMP 创建的互操作程序集?

c# - MongoDB C# 驱动程序 - 如何查询子文档数组的属性

c# - WPF MVVM 更新源但不更新 GUI

c# - 将用户映射到连接 ID 的最佳方法是什么

multithreading - 我的System.Threading.Tasks.Task用法有什么问题?