这是我在这里发表的第一篇文章,但这个论坛对我帮助很大。
首先,对不起我的英语,我来自巴西,我正在努力写作而没有翻译。
我正在为超市开发软件,但我遇到了与数据库连接的问题。我正在尝试以编程方式创建所有连接和事务(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并进行更改并更新数据库?
有人可以向我解释这个或给我一个例子吗?
谢谢。
答案 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