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