2012-04-16 85 views
9

我在同一页面上有一个SqlDataSource,一个Gridview和一个DropDownList。 DropDownList选项与一组SelectCommands,UpdateCommands和DeleteCommands相关联,以便我可以利用GridView AutoGenerateEditButton =“true”和AutoGenerateUpdateButton =“true”机制。事件顺序后面的SqlDataSource代码

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

有一个名为动态数据的内置模板,附带ASP。网络开箱即用,通常可以查看,更新,编辑和删除数据源中任何表中的记录。您还可以自定义单个页面,单个操作,字段类型等。有关详细信息,请访问:http://msdn.microsoft.com/en-us/library/ee845452(v=VS.100).aspx – mellamokb 2012-04-21 02:14:43

+0

您是否考虑过使用'LinqDataSource'和LINQ-To-SQL /等。用于处理数据库?它可以更容易,因为它自动处理选择/插入/更新的管道。 – mellamokb 2012-04-21 02:17:08

+0

即使您不使用动态数据,查看某些工作原理的源代码也可能不是一个好主意,以了解如何简化代码并利用内置工具生成SQL语句等等。这种事情以前已经做过很多次了,取决于你如何去做这件事情,要做到这一点更容易,也更困难。 – mellamokb 2012-04-21 02:41:52

回答

10

编辑:它不会出现,如果你在GridView上使用的AutoGenerateColumns =“true”,并通过SqlDataSource的填充,它会自动通过名称绑定控件的值,在SQL查询中相应的参数没有任何多余的码。然而,我们必须使用GetInsertCommand(true)等,从而使命令使用的列名(见下面,我展示了如何使用SqlCommandBuilder有几个陷阱代码,但是我在测试中已经发现:

  • 你需要设置你的GridView的DataKeyNames
  • 你需要设置OldValuesParameterFormatString="Original_{0}"您sqlDS。
  • 你需要在你的scb.ConflictOption = System.Data.ConflictOption.OverwriteChanges;SqlCommandBuilder如果你想不比较旧的值只更新。
  • 它看起来如果你正在填充选择/更新/删除以编程方式在SqlDataSource上执行eCommand,您必须在每次回发时执行此操作。

但是,如果你需要定制,在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类,这样你就不必建立一个包含所有表的一个巨大的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; 

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

+1

非常感谢! SqlCommandBuilder的.GetInsertCommand(true)部分就是我所缺少的。我是动态生成一个字符串,而不是一个命令!我也计划最终使用LinqDataSource,但现在只有一部分代码使用Linq;我正在更新它的过程中。再次感谢! – Mark 2012-04-22 15:45:42