Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用BindingSource数据更新数据库_Vb.net_Dataset_Updating_Bindingsource - Fatal编程技术网

Vb.net 使用BindingSource数据更新数据库

Vb.net 使用BindingSource数据更新数据库,vb.net,dataset,updating,bindingsource,Vb.net,Dataset,Updating,Bindingsource,这是我在这里的第一篇帖子,但是这个论坛已经帮了我很多 首先,对不起我的英语,我来自巴西,我想在没有翻译的情况下写作 我正在为一家超市开发一个软件,但是我在连接数据库时遇到了问题。我试图以编程方式创建所有连接和事务,包括数据集、绑定源等等 我已经使用模块db中的函数consulta成功连接了SQL Server Express 2008: Dim ad As SqlDataAdapter = New SqlDataAdapter Function consulta(ByVal tabela As

这是我在这里的第一篇帖子,但是这个论坛已经帮了我很多

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

我正在为一家超市开发一个软件,但是我在连接数据库时遇到了问题。我试图以编程方式创建所有连接和事务,包括数据集、绑定源等等

我已经使用模块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的连接。所以我需要重新打开这个连接,然后,以某种方式读取带有更改的数据集并更新数据库

有人能给我解释一下或者给我举个例子吗


谢谢。

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

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

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

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