更新表并添加新的主索引列

问题描述

我有一个成绩簿数据库,当我计算平均值时,我使用下面的 csql 语句将它们转储到不同数据库中的表中。我有两个问题 - 一个,我无法更新新表,因为它没有主键。二,我试图添加一个自动编号列来解决这个问题,但我所做的似乎没有为我添加一个新列。这是代码 - 我错过了什么?

    csql = "Select [StudentID],[StudentLast] as [Last Name],[StudentFirst] as [First Name],[MI],"
    csql = csql & "AVG(Grade) AS [Average],MAX([Letter]) as [Letter],COUNT([Grade]) as [# Assign] "
    csql = csql & ",[Subject],[Term] INTO [SubjectAverages] in '" & AppDir & "\averages.mdb'"
    csql = csql & " FROM [Grades] WHERE [Subject] = '" & FixApost(cboSubject.Text) & "' AND [Term] = " & LastTerm
    csql = csql & " GROUP BY [StudentLast],[StudentFirst],[StudentID],[Term] ORDER BY [StudentLast],[MI] ;"

    Try
        'Use csql Statement to calculate Averages into table SubjectAverages in DB: 'Averages.mdb'
        OpenDB2()
        da = New OleDbDataAdapter(csql,con)
        dt.Columns.Clear()
        dt.Rows.Clear()
        da.Fill(dt)

        'Add New Column
        dt.Columns.Add("Number",GetType(Integer))

        'Are these needed?
        dt.AcceptChanges()
        da.Update(dt)

        con.Close()

    Catch ex As Exception
        Me.Cursor = Cursors.Default
        MessageBox.Show("Error during Chart Update." + ControlChars.CrLf + ex.Message,"Classroom Grader DB Error",MessageBoxButtons.OK,MessageBoxIcon.Error)
        Closeanddispose2()
        Exit Sub
    End Try

解决方法

那里有很多问题。首先,您不能通过向 DataTable 添加列来修改数据库表的架构。您需要对数据库执行 ALTER TABLE 语句。您可以通过创建 OleDbCommand 并调用 ExecuteNonQuery 来实现。要准确了解如何编写这样的 SQL 语句,您应该对 Jet SQL 尤其是 ALTER TABLE 语句进行一些研究。

也就是说,如果可能的话,在 Access 中简单地打开数据库并直观地更改架构会更有意义。

至于您在上面实际执行的 SQL,您根本不应该使用数据适配器。您直接在数据库之间移动数据而无需应用程序干预,因此,您应该再次使用 OleDbCommand 并调用 ExecuteNonQuery。如果您在一个步骤中将数据提取到您的应用程序中,然后在另一个步骤中将其保存到另一个数据库中,那么数据适配器和 DataTable 将是正确的选择,尽管代码结构需要进行重大更改。