通过从另一个表中提取数据来INSERT INTO表

时间:2013-04-10 18:56:34

标签: asp.net sql vb.net ms-access relational-database

我从其他人那里继承了这个项目,并且需要清理它以满足新的要求 - 他们设计的就是这样......

我的Access数据库中有2个表(我在大括号中包含了字段的数据类型):

活动:

EventID {AutoNumber} | EventTitle {短文} | EventDescription {长文本} | EventDate {日期/时间} | EventCategory {使用行/ CategoryTitle的行源查找}

分类

CategoryID {AutoNumber} | CategoryTitle {短文} | CategoryImage {短文本} | CategoryColor {短文本}

'类别' table拥有所有的' Master'有关特定类别的信息,例如它的名称,它的图标(例如刻度线,十字架等)。

我有一个查询(在Access内部)将这两个表中的数据拉到一起,顺序如下:

EventID | EventTitle | EventDescription | EventDate | CategoryTitle | CategoryImage

查询的SQL是:

SELECT Events.EventID, Events.EventTitle, Events.EventDescription,
Events.EventDate, Categories.CategoryTitle, Categories.CategoryImage,
Categories.CategoryColor FROM Events INNER JOIN Categories ON
Events.EventCategory = Categories.CategoryID ORDER BY
Events.EventDate;

网站的其他区域依赖查询来检索信息。

在Visual Studio中,我尝试将asp文本框和下拉控件中的值插入到我的数据库中的以下字段中:

  1. EventTitle(至Events.EventTitle)
  2. EventDescription(至Events.EventDescription)
  3. EventDate(至Events.EventDate)
  4. EventCategory(至Events.EventCategory)
  5. 4号是有问题的,因为它目前是对" Master"的访问查找。事件表,其中包含有关实际类别的信息。据推测,从来没有打算以这种方式将数据插入表中;设置事件类别的唯一可能方法是使用Access数据库中的下拉组合框来选择事件。

    最后这里是我写的插入数据库的子例程:

     Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
         Dim conn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString)
         conn.Open()
         Dim cmd As New OleDbCommand("INSERT INTO Events (EventTitle, EventDescription, EventDate, EventCategory) VALUES (@f1,@f2,@f3,@f4)",
        conn)
         cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text)
         cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text)
         cmd.Parameters.AddWithValue("@f3", DateTime.ParseExact(tb_eventdate.Text, "dd/MM/yyyy",
         CultureInfo.InvariantCulture))
         cmd.Parameters.AddWithValue("@f4", dd_eventcategory.SelectedValue)
         cmd.ExecuteNonQuery()
         conn.Close()
     End Sub
    

    网站上的其他地方还有其他ASP.NET数据控制控件依赖于'类别'的内容。表格保持不变,那我怎样才能插入“事件”#39;包含上面列出的字段的表格(具体 EventCategory)?

    修改

    这是我完成的子项目:

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles
      Button1.Click
         Dim conn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString)
         conn.Open()
         Dim cmd As New OleDbCommand("INSERT INTO Events (EventTitle, EventDescription, EventDate, EventCategory) VALUES (@f1,@f2,@f3,@f4)",
         conn)
         cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text)
         cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text)
         cmd.Parameters.AddWithValue("@f3", DateTime.ParseExact(tb_eventdate.Text, "dd/MM/yyyy",
         CultureInfo.InvariantCulture))
         cmd.Parameters.AddWithValue("@f4", dd_eventcategory.SelectedIndex + 1)
         cmd.ExecuteNonQuery()
         conn.Close()
     End Sub
    

1 个答案:

答案 0 :(得分:2)

查找字段可能是欺骗性的。假设您有[类别]表

CategoryID  CategoryTitle
1           Pub Crawl
2           Booze Up
3           Big Drunk

,当您在数据表视图中打开它时,[事件]表格如下所示

EventID EventTitle  EventCategory
1       Thursday    Pub Crawl

如果你想添加一个新的“星期五”活动,你会认为它会像

INSERT INTO Events (EventTitle, EventCategory) VALUES ("Friday", "Big Drunk")

但由于类型转换失败而导致“Microsoft Access将1字段设置为Null”失败...“。相反,你必须做

INSERT INTO Events (EventTitle, EventCategory) VALUES ("Friday", 3)

其中3数字 CategoryID,而不是您在数据表视图中看到的内容。

因此,您需要做的是确保从组合框(而不是CategoryTitle)中检索(数字)CategoryID并将其插入到Events表中。

BTW,这就是为什么经验丰富的Access开发人员避免查找字段的原因:它们隐藏了数据库的实际工作情况,导致混乱,沮丧,是的,驱使一些用户喝酒......;)