【问题标题】:Inserting data into a database table via SqlDataSource通过 SqlDataSource 将数据插入数据库表
【发布时间】:2012-01-18 15:23:55
【问题描述】:

最近我一直在看 Plural Sight ASP.NET 关于数据绑定的视频,我偶然发现了声明式数据源控件,例如 <asp:SqlDataSource />

我无法理解为什么我无法在 sql server 2008 数据库中的电影表中插入默认电影标题和发行日期。到目前为止,我还没有遇到任何问题,并且已经能够通过 gridView 通过 SelectCommand 访问表,但是当我单击插入电影按钮时,新的手动制作的电影参数不会添加到表中。

这是我的代码以便更好地查看:

InsertCommand="INSERT INTO movies (title, release_date) VALUES (@title, @release_date)"
SelectCommand="SELECT TOP 30 movie_id, title, release_date FROM movies ORDER BY movie_id DESC"
runat="server" ID="_moviesDataSource" DataSourceMode="DataReader">
<InsertParameters>
    <asp:Parameter Name="title" />
    <asp:Parameter Name="release_date"/>
</InsertParameters>
</asp:SqlDataSource>
<asp:Button ID="Button1" runat="server" Text="Insert new movie" 
    onclick="Button1_Click" /><br /><br />
<asp:GridView ID="_moviesGridInsert" runat="server" DataSourceID="_moviesDataSource">
</asp:GridView>

正如您在上面可能注意到的,我在 Parameter asp 标记中没有 Type="...",但在此之前,我的类型等于 string 的 title 和 dateTime 的 release_date。问题可能是我在数据库中设置的值与我上面声明的值不同吗?

它的C#后端:

protected void Button1_Click(object sender, EventArgs e)
{
    Page.MaintainScrollPositionOnPostBack = true;

    // TODO - Insert movie (manually inserted with just user input of button click)
    _moviesDataSource.InsertParameters["title"].DefaultValue = "My movie";
    _moviesDataSource.InsertParameters["release_date"].DefaultValue = "01/01/2008";
    _moviesDataSource.Insert();
}

我还不允许发布图像,因此无法添加网格,即使您可以查看表格本身会有所帮助...但是无论如何,一旦单击按钮,表格就会保持同样,当我查看数据库时,没有添加新值。

【问题讨论】:

  • "release_date"].DefaultValue = "01/01/2008";发布日期真的是字符串吗?
  • @SteveWellens release_date 类型是 DateTime,在用户控件表单中指定。我相信当您插入参数时,它们都需要在引号中。还是谢谢
  • 对,或许显式设置类型会有所帮助,例如:SqlDataSource1.SelectParameters[0].DbType = DbType.Date;
  • 只是一个建议,不要使用 sqldatasource。原因?要说的太多了。坚持下去
  • @BenSewards 我没有说它是垃圾。但是,可以说,这不是最佳实践。以下是一些原因: 1. 与数据库相关的代码最好放在应用程序的另一层,而不是在 UI 中。如果您需要再次执行相同的查询会怎样?你会创建另一个 SQLDataSource 吗?相反,您应该能够调用函数来返回数据集并根据需要填充尽可能多的控件; 2. 为了代码的可维护性:如果查询可能发生变化,您将需要修改每一个 SQLDataSource。在另一种情况下,您只需修改一个查询。希望这会有所帮助

标签: asp.net sql-server-2008 data-binding sql-insert sqldatasource


【解决方案1】:

SqlDataSource 标记或 Button1_Click() 方法中的任何内容都绝对没有问题。

问题:

  1. 有一个验证表单,因为我有 Page.Validate(),所以在填写表单之前不允许页面验证。我通过将所有表单验证添加到 Group ID 并设置:Page.Validate("form1") 来解决此问题。
  2. 修复上述问题后,我必须转到我的表设置(在 Visual Studio 上比在 SQL 管理中更容易完成)并将 movie_id 设置为自动增量。这样做的原因是该值不在参数中,因此如果它不自动递增,它将尝试将该列的值设置为 NULL(并且在大多数情况下,不允许使用 NULL 或在我的情况下不需要)。

@Steve Wellens,感谢您的努力!希望有人能从这个小技巧中学习!

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2012-07-03
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多