事件顺序背后的SqlDataSource代码

时间:2012-04-16 04:43:03

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

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

1 个答案:

答案 0 :(得分:10)

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

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

但是,如果您需要自定义,SqlDataSource控件会提供可用于在SQL之前填充参数的事件InsertingUpdatingDeleting对数据库采取了行动:

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访问权限可以在Deletinge.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;

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