使用BindingSource数据更新数据库

时间:2014-10-26 19:13:00

标签: vb.net dataset updating bindingsource

这是我在这里发表的第一篇文章,但这个论坛对我帮助很大。

首先,对不起我的英语,我来自巴西,我正在努力写作而没有翻译。

我正在为超市开发软件,但我遇到了与数据库连接的问题。我正在尝试以编程方式创建所有连接和事务(DataSets,BindingSources等)。

我已经设法使用模块(“db”)中的函数(“consulta”)连接SQL Server Express 2008:

 Dim ad As SqlDataAdapter = New SqlDataAdapter
Function consulta(ByVal tabela As String, Optional opt As Boolean = False, Optional optparam As String = "") As DataSet
    Dim ds As New DataSet
    Try
        Dim connstring As String = "Data Source=NOTEBOOK\SQLEXPRESS;Initial Catalog=SysMarket;Persist Security Info=True;User ID=admin;Password=XXXXXX"
        Dim conObj As New SqlConnection(connstring)
        Dim sql As String

        If opt = True Then
            sql = "SELECT * FROM " & tabela & " " & optparam
        Else
            sql = "SELECT * FROM " & tabela
        End If

        Dim cmd As SqlCommand = New SqlCommand(sql, conObj)



        ad.SelectCommand = cmd

        conObj.Open()

        ad.Fill(ds, tabela)
        ad.Dispose()
        cmd.Dispose()
        conObj.Close()

        Return ds
    Catch ex As Exception
        MessageBox.Show("Erro na consulta" & vbCrLf & ex.InnerException.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        ds.Clear()
        Return ds

    End Try

End Function

这是我编写SelectQuery并放入BindingSource的主代码的一部分:

  Dim ds As DataSet = db.consulta("departamentos")
Private Sub cad_departamento_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    BindingSource1.DataSource = ds
    BindingSource1.DataMember = "departamentos"
    TextBox1.DataBindings.Add("Text", BindingSource1, "id")
    TextBox2.DataBindings.Add("Text", BindingSource1, "departamento")
End Sub

但我的问题是我必须通过添加,编辑或删除BindingSource中的某些项来更新数据库。因为在模块中我已经关闭了与SQL Server的连接。所以我需要重新打开这个连接,然后以某种方式“读取”DataSet并进行更改并更新数据库?

有人可以向我解释这个或给我一个例子吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

您将使用数据适配器来保存数据,就像您使用数据适配器来检索数据一样。如果要插入新记录,则必须创建InsertCommand;如果要更新现有记录,则必须创建UpdateCommand;如果要删除现有记录,则必须创建DeleteCommand。您可以自己编写,或者,如果条件合适,您可以使用命令构建器为您执行此操作。

如果您的查询基于单个表,并且您想要将检索到的所有列插入/更新回同一个表,那么SqlCommandBuilder可能是您最好的选择。您只需传递查询,命令构建器将使用它来生成操作命令。这为您提供了有限的灵活性,但如果您只是进行单桌操作,那么您就不需要增加灵活性。

这样的方法看起来像这样:

Public Sub SaveChanges(tableName As String, data As DataSet)
    Dim query = "SELECT * FROM " & tableName

    Using adapter As New SqlDataAdapter(query, "connection string here")
        Dim builder As New SqlCommandBuilder(adapter)

        adapter.Update(data, tableName)
    End Using
End Sub

答案 1 :(得分:0)

我做了你说的话,但当我再次打开表格时,新数据不存在。

我在代码中做了一些更改,可能是因为它不起作用

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    BindingSource1.EndEdit()
    ds.AcceptChanges()

    db.SaveChanges("departamentos", "INSERT INTO departamentos VALUES('', " & TextBox2.Text & ")", ds)

    ds = db.consulta("departamentos")


End Sub

模块中的代码

 Function SaveChanges(tableName As String, query As String, data As DataSet)


    Using adapter As New SqlDataAdapter(query, "Data Source=NOTEBOOK\SQLEXPRESS;Initial Catalog=SysMarket;Persist Security Info=True;User ID=admin;Password=XXXXX")
        Dim builder As New SqlCommandBuilder(adapter)

        adapter.Update(data, tableName)

        Return True

    End Using
End Function