我在同一页面上有一个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()逻辑,因为我不完全理解与数据绑定相关的事件的顺序。
查询并不复杂,不涉及连接或视图;它们是单个表的简单SELECT。
答案 0 :(得分:10)
编辑:看起来如果你在GridView上使用AutoGenerateColumns =“true”并通过SqlDataSource填充,它会自动将控件的值按名称绑定到SQL中的相应参数查询没有任何额外的代码。但是,我们必须使用GetInsertCommand(true)
等,以便命令使用列名称(请参阅下面的代码,我将展示如何使用SqlCommandBuilder
。有一些问题,但是我发现了在测试中:
DataKeyNames
OldValuesParameterFormatString="Original_{0}"
。scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
上需要SqlCommandBuilder
。但是,如果您需要自定义,SqlDataSource
控件会提供可用于在SQL之前填充参数的事件Inserting
,Updating
,Deleting
对数据库采取了行动:
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[...]
个活动中完成同样的事情。
请注意,您还可以使用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模板预先生成它们,而不是手动输入它们。