2014-10-26 138 views
0

这是我在这里的第一篇文章,但这个论坛已经帮了我很多。使用BindingSource数据更新数据库

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

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

我已经成功地与SQL Server Express 2008连接,使用一个模块( “DB”)内的功能( “CONSULTA”):

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

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