将列从DGV添加到SQL服务器的问题

时间:2016-06-09 12:42:53

标签: sql-server database vb.net datasource dataadapter

对不起,如果标题有点模糊,但我不确定如何将它放在一个短的空间内。

对于上下文,我有一个保存按钮,即在SQL Server数据库中更新所做的更改。这在添加行,更改值,甚至删除行时都可以正常工作。那里没有错。

然而,当我尝试添加或删除列时,应用程序变得有点问题,并且根本不更新数据库中添加/删除的列并且不会引发错误。

我可以添加或删除列的唯一方法是在添加/删除按钮上使用sql查询,但这会直接保存到服务器 - 这是我不想要的。

我需要的是更改显示在表中,然后仅在单击保存按钮时更新数据库。

我的代码在这里---(注意,这是通过三种形式完成的,我有表格的主要表格,还有两个用于输入"培训师栏目的名称"要添加或删除的内容)

    Private Function save() ''''' Main form
    Try
        ds.Tables(0).AcceptChanges()
        da.Update(ds)
        DataTableColours()
        MessageBox.Show("Data updated successfully.")
    Catch
        MessageBox.Show("Data failed to update properly. Please ensure you are connected to the Baltic network and try again. If the problem persists, seek IT support.")
    End Try
End Function

Public Function AddTrainerFunc() ''''' Main form
    'Dim SqlAddCol As String = "ALTER TABLE MasterTrainerSchedule ADD [" & TrainerName.Trim() & "] nvarchar(255)"
    'Using con As New OleDbConnection(cs)
    '    Using cmd As New OleDbCommand(SqlAddCol, con)
    '        con.Open()
    '        cmd.ExecuteNonQuery()
    '    End Using
    'End Using

    ds.Tables(0).Columns.Add(TrainerName.Trim()).DefaultValue = " "
    RefreshBtn()
End Function

Public Function delTrainerFunc() ''''' Main form
    Dim SqlDelCol As String = "ALTER TABLE MasterTrainerSchedule DROP COLUMN [" & TrainerName.Trim() & "]"
    Using con As New OleDbConnection(cs)
        Using cmd As New OleDbCommand(SqlDelCol, con)
            con.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
    ds.Tables(0).Columns.Remove(TrainerName)
    DelTrainer.Close()
    RefreshBtn()
    MessageBox.Show("Trainer '" & TrainerName.Trim() & "' has been deleted from the table.")
End Function

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click '''''Add Column Form
    If Not txtTrainerName.Text = "Trainer Name Here" Or txtTrainerName.Text = "" Then
        MTS.TrainerName = txtTrainerName.Text
        MTS.Enabled = True
        Me.Close()
        MTS.AddTrainerFunc()
    Else
        MessageBox.Show("Please input a name for the trainer in the text box above.")
    End If
End Sub

Private Sub btnDel_Click(sender As Object, e As EventArgs) Handles btnDel.Click ''''' Delete Column form
    Dim delYN As Integer = MessageBox.Show("Are you sure you want to delete '" & cmbTrainers.Text & "' from the MTS table? The action will be permanent!", "Delete Trainer?", MessageBoxButtons.YesNo)
    If delYN = DialogResult.Yes Then
        MTS.Enabled = True
        MTS.delTrainerFunc()
    End If

End Sub

很抱歉,如果这有点长篇大论但是......我似乎无法找到一种方法来将数据库添加到数据库中,无论是通过谷歌搜索,也不是通过简单的实验,所以我来到这里是希望你们中的一个人能够提供帮助。提前感谢您提供的任何帮助。

编辑---我使用oleDB作为sql的连接,如果这有帮助。

编辑2 ---这里有一些屏幕截图,以防您希望了解应用的视觉方面。

The add form being used. (with the main form in the background. Sorry I couldnt get that on its own - only allowed two links with 6 rep!)

And the delete trainer form. The dropdown lists everyone in the table for you, then prompts you when you click "delete"

编辑3 ---好的,我知道Sean所处理的规范化表可能有用,但它可能需要对所使用的服务器和程序进行相当大的改动。我设法找到一种更简单的方法来调用sql查询,只有在对数据网格进行了更改之后才调用sql查询来向保存表中添加或删除列。

如果有人感兴趣,请提供一些代码。它有点乱,可能会稍微优化一下,但无论如何这对我有用。 `私人功能保存()

    Try
        da.Update(ds)
        DataTableColours()
        MessageBox.Show("Data updated successfully.")
    Catch
        MessageBox.Show("Data failed to update properly. Please ensure you are connected to the Baltic network and try again. If the problem persists, seek IT support.")
    End Try

    'This section reads the SQL server for column names, and adds any that are listed in the DGV, but not the database. I know its a little messy but itll do.
    Dim columnnum As Integer = -1
    Dim columname As String
    For Each column In ds.Tables(0).Columns
        columnnum = columnnum + 1
        columname = dgvSchedule.Columns(columnnum).HeaderText
        If Not ds2.Tables(0).Columns.Contains(columname) Then
            MessageBox.Show("Table does not include " & columname)

            Dim SqlAddCol As String = "ALTER TABLE MasterTrainerSchedule ADD [" & columname.Trim() & "] nvarchar(255)"
            Using con As New OleDbConnection(cs)
                Using cmd As New OleDbCommand(SqlAddCol, con)
                    con.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using

        End If
    Next

    columnnum = -1
    For Each column In ds2.Tables(0).Columns
        columnnum = columnnum + 1
        columname = ds2.Tables(0).Columns(columnnum).ColumnName
        If Not ds.Tables(0).Columns.Contains(columname) Then
            MessageBox.Show("Will Delete " & columname)

            Dim SqlDelCol As String = "ALTER TABLE MasterTrainerSchedule DROP COLUMN [" & columname.Trim() & "]"
            Using con As New OleDbConnection(cs)
                Using cmd As New OleDbCommand(SqlDelCol, con)
                    con.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End If
    Next

    ds2.Tables.Clear()
    da2 = New OleDbDataAdapter(sql, cs)
    da2.Fill(ds2)

End Function`

1 个答案:

答案 0 :(得分:1)

我不知道你在这里做了很多细节,但这里有一个更为规范化的方法的例子。

--version