【问题标题】:Updating database with BindingSource data使用 BindingSource 数据更新数据库
【发布时间】:2014-12-21 23:58:07
【问题描述】:

这是我在这里的第一篇文章,但这个论坛已经帮助了我很多。

首先,对不起我的英语,我来自巴西,我正在尝试在没有翻译的情况下写作。

我正在为一家超市开发软件,但我在连接数据库时遇到问题。我正在尝试以编程方式进行所有连接和事务(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 并更新数据库?

谁能给我解释一下或者给我一个例子?

谢谢。

【问题讨论】:

    标签: vb.net dataset updating bindingsource


    【解决方案1】:

    您将使用数据适配器来保存数据,就像您使用数据适配器检索数据一样。如果要插入新记录,则必须创建 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
    

    【讨论】:

      【解决方案2】:

      我按照你说的做了,但是当我再次打开表单时,新数据不存在。

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2021-09-15
        • 2011-10-17
        • 1970-01-01
        相关资源
        最近更新 更多