我从其他人那里继承了这个项目,并且需要清理它以满足新的要求 - 他们设计的就是这样......
我的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文本框和下拉控件中的值插入到我的数据库中的以下字段中:
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
答案 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开发人员避免查找字段的原因:它们隐藏了数据库的实际工作情况,导致混乱,沮丧,是的,驱使一些用户喝酒......;)