1

我从其他人那里继承了这个项目,需要对其进行清理以满足新的要求——他们是这样设计的。

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

事件:

事件ID {自动编号} | EventTitle {短文本} | 事件描述 {长文本} | EventDate {日期/时间} | EventCategory {使用 Categories/CategoryTitle 的行源查找}

分类:

CategoryID {自动编号} | CategoryTitle {短文本} | CategoryImage {短文本} | CategoryColor {短文本}

“类别”表包含有关特定类别的所有“主”信息,例如名称、图标(例如勾号、十字等)。

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

事件ID | 活动标题 | 事件描述 | 活动日期 | 类别标题 | 类别图像

查询的 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)

第 4 号是有问题的,因为它目前是对“主”事件表的访问查找,该表包含有关实际类别的信息。据推测,从来没有打算以这种方式将数据插入表中。设置事件类别的唯一可能方法是使用 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 数据绑定控件,它们依赖于“类别”表的内容保持不变,所以我怎样才能将上面列出的字段插入到“事件”表中(特别是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
4

1 回答 1

2

查找字段可能具有欺骗性。假设您有 [Categories] 表

CategoryID  CategoryTitle
1           Pub Crawl
2           Booze Up
3           Big Drunk

当您在数据表视图中打开 [Events] 表时,它看起来像这样

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)

数字3CategoryID在哪里,而不是您在数据表视图中看到的。

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

顺便说一句,这就是为什么经验丰富的 Access 开发人员会避免查找字段的原因:他们隐藏了数据库的实际工作,导致混乱、沮丧,而且,是的,让一些用户喝醉了……;)

于 2013-04-10T19:27:56.603 回答