我在同一个页面上有一个 SqlDataSource、一个 Gridview 和一个 DropDownList。 DropDownList 选择与一组 SelectCommands
、UpdateCommands
和 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
控件提供事件 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
}
同样的事情可以通过 e.Command.Parameters[...]
在 Inserting
和 Deleting
事件中完成访问权限。
请注意,您还可以使用 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/