2014-10-26 193 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