数据库不更新新行

时间:2014-01-07 19:02:21

标签: sql vb.net datagridview

Insert new row inside DataGridView

这个答案使得数据库看起来应该使用rows.add

进行更新

其他一些网站有说明,但形成了从头开始创建数据库的视角。我已经有了一个数据库,只是想让愚蠢的事情接受新数据。

这就是我所做的:

Private Sub InitializeDataGridView()
    Try
        ' Set up the DataGridView. 
        With Me.DataGridView1
            ' Automatically generate the DataGridView columns.
            .AutoGenerateColumns = True

            ' Set up the data source.
            'bindingSource1.DataSource = GetData("SELECT * FROM Places and Stuff")
            MyTable = GetData("SELECT * FROM Places and Stuff")
            'MyDataSet = bindingSource1.DataSource
            'MyTable = MyDataSet.Tables(0)
            .DataSource = MyTable

            ' Automatically resize the visible rows.
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders

            ' Set the DataGridView control's border.
            .BorderStyle = BorderStyle.Fixed3D

            ' Put the cells in edit mode when user enters them.
            .EditMode = DataGridViewEditMode.EditOnEnter

            ' Disables Add New Row
            .AllowUserToAddRows = False

        End With
    Catch ex As SqlException
        MessageBox.Show(ex.ToString, _
            "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        System.Threading.Thread.CurrentThread.Abort()
    End Try
End Sub

我将DGV绑定到表格。看起来我可能需要在某个地方更新数据集,但我无法弄清楚如何使用也是sql数据库的表填充数据集。您还可以看到我在其他数据集/数据表等处使用过的地方。

我还有我的datagridview添加一行,但数据库是懒惰的:

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click

    'Determine Last Row Index
    Dim dgvrowCnt As Integer = DataGridView1.Rows.Count - 1
    If DataGridView1.Rows.Count > 0 Then
        Dim myRow As DataRow = MyTable.NewRow
        myRow(0) = DataGridView1.Rows(dgvrowCnt).Cells(0).Value + 1
        MyTable.Rows.Add(myRow)
    Else
        Dim myRow As DataRow = MyTable.NewRow
        myRow(0) = 230
        MyTable.Rows.Add(myRow)
    End If

End Sub

我因为无法使用myRow("<column name here>") = 230而感到有点难过,但我想我必须克服它。

我尝试刷新并检查表格,看看我的表单是否需要刷新,但似乎并非如此。

此页面http://support.microsoft.com/kb/301248有2行,并声称它符合我的希望:     Dim objCommandBuilder As New SwlCammandBuilder(daAuthors) daAuthors.Update(dsPubs, "Authors")

我无法将表格放入数据集中,如我示例的绑定行所示。

1 个答案:

答案 0 :(得分:2)

您似乎还没有理解ADO.NET的基本概念。 DataTable和其他对象(如DataSet)是“已断开连接”的对象,这意味着添加/更新和删除行不会更新/插入/删除数据库表。

您需要创建一个SqlCommand,准备其命令文本,然后执行查询以更新您的数据库(其他方法包括使用SqlDataAdapter及其Update方法)

例如,要在数据表中插入单行,您的代码应该是这样的

Using con = New SqlConnection(.....constringhere...)
Using cmd = new SqlCommand("INSERT INTO table1 (field1) values (@valueForField)", con)
    con.Open()
    cmd.Parameters.AddWithValue("@valueForField", newValue)
    cmd.ExecuteNonQuery()
End Using
End Using

A more complete tutorial could be found here

相反,这可能是一个伪代码,使用SqlDataAdapterSqlCommandBuilder来自动构建将更改存储回数据库所需的命令

' Keep the dataset and the adapter at the global class level'
Dim da As SqlDataAdapter = Nothing
Dim ds As DataSet

Private Function GetData(ByVal sqlCommand As String) As DataSet

    ds As New DataSet()

    Dim connectionString As String = "Data Source=...."
    Using con = New SqlConnection(connectionString)
        conn.Open()
        Using command = New SqlCommand(sqlCommand, con)
            Using da = New SqlDataAdapter(command)
                da.Fill(ds)
            End Using
        End Using
    End Using
    Return ds
End Function

使用GetData返回的DataSet中的第一个表作为网格的数据源(或者只使用整个数据集)

.DataSource = GetData(.......).Tables(0)


' Add a new button to submit changes back to the database'
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
     Dim builder = New SqlCommandBuilder(da)
     da.UpdateCommand = builder.GetUpdateCommand()
     da.InsertCommand = builder.GetInsertCommand()
     da.DeleteCommand = builder.GetDeleteCommand()
     da.Update(ds)
End Sub

请注意,我无法测试此代码,并且我将其作为伪代码提供,而不需要更强大的应用程序进行任何错误检查。