事件顺序背后的SqlDataSource代码

Mar*_*ark 9 c# asp.net c#-4.0

我在同一页面上有一个SqlDataSource,一个Gridview和一个DropDownList.DropDownList的选择与一组相关联的SelectCommands,UpdateCommands以及DeleteCommands这样我可以利用在GridView AutoGenerateEditButton属性="真"和AutoGenerateUpdateButton ="真"的机制.

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();
}
Run Code Online (Sandbox Code Playgroud)

我需要如何或在什么时候添加参数?它是自动的吗?我基本上只是希望能够更新和删除表中的列.我想在实际的.cs文件中完成所有这些操作,而不是在.aspx文件中,因为我希望最终使它更具动态性; 但是现在我只想把基础知识搞定.我怀疑我可能在不适当的事件中有DataBind()逻辑,因为我不完全理解与数据绑定相关的事件的顺序.

查询并不复杂,不涉及连接或视图; 它们是单个表上的简单SELECT.

mel*_*okb 10

编辑:看起来如果你在GridView上使用AutoGenerateColumns ="true"并通过SqlDataSource填充,它会自动将控件的值按名称绑定到SQL查询中的相应参数,而不需要任何额外的代码.但是,我们必须使用GetInsertCommand(true)等等,以便命令使用列名称(请参阅下面的代码,我将展示如何使用SqlCommandBuilder.有一些问题,但正如我在测试中发现的那样:

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

但是,如果你需要定制,该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
}
Run Code Online (Sandbox Code Playgroud)

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


请注意,您还可以使用SqlCommandBuilder类自动生成相应的"删除/插入/更新"命令,这样您就不必构建包含所有表的巨型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;
Run Code Online (Sandbox Code Playgroud)

这当然要求所有表都具有可用于生成相关更新和删除语句的主键.如果没有,您将获得有关动态SQL生成的例外.即使您不喜欢这种方法,因为在数据库引擎上查找模式的运行时成本,您总是可以使用T4模板预先生成它们,而不是手动输入它们.