将本地数据库的所有修改数据更新到服务器数

时间:2015-12-30 03:52:25

标签: mysql vb.net winforms

当我想将数据从本地数据库更新为服务器数据时,我将面临一个问题,替换在本地数据库中修改过的所有内容。我知道这可能很简单,但我对此一无所知,所以任何帮助都会受到赞赏。

  

在我的情况下,我想使用一个按钮将所有修改过的数据上传到   服务器数据库。现在,我只是在同一台服务器上使用2个数据库   测试

Private Sub btnUp_Click(sender As System.Object, e As System.EventArgs) Handles btnUp.Click
    localconn.ConnectionString = lctext
    serverconn.ConnectionString = sctext
    Try
        localconn.Open()
        serverconn.Open()
        Dim localcmd As New OdbcCommand("select a.acc_id as localid, a.acc_brcid, a.smartcardid, a.acc_created, a.acc_modified as localmodified, b.acd_firstname, b.acd_ic, b.acd_oldic, b.acd_race, b.acd_dob, b.acd_rescity, b.acd_resaddr1, b.acd_telmobile, b.acd_email, b.acd_telwork, b.acd_modified, b.acd_accid from nsk_account a inner join nsk_accountdetail b on a.acc_id = b.acd_accid", localconn)

        Dim servercmd As New OdbcCommand("select c.acc_id, c.acc_brcid, a.smartcardid, c.acc_created, c.acc_modified, d.acd_firstname, d.acd_ic, d.acd_oldic, d.acd_race, d.acd_dob, d.acd_rescity, d.acd_resaddr1, d.acd_telmobile, d.acd_email, d.acd_telwork, d.acd_modified, d.acd_accid from nsk_account c inner join nsk_accountdetail d on c.acc_id = d.acd_accid", serverconn)

        localcmd.CommandType = CommandType.Text
        Dim rdr As OdbcDataReader = localcmd.ExecuteReader()
        Dim thedatatable As DataTable = rdr.GetSchemaTable()

        'localcmd.Parameters.Add("@localid", OdbcType.Int, "a.acc_id")
        'localcmd.Parameters.Add("@localmodified", OdbcType.DateTime, "b.acd_modified")
        Dim localid As String
        Dim localmodi As String
        localcmd.Parameters.AddWithValue("localid", localid)
        localcmd.Parameters.AddWithValue("localmodified", localmodi)

        For Each localid In thedatatable.Rows
            Dim calldata As New OdbcCommand("SELECT acc_modified from nsk_account where acc_id ='" + localid + "'", serverconn)
            Dim reader As OdbcDataReader = calldata.ExecuteReader
            txtSDate.Text = reader("acc_modified").ToString
            If localmodi <= txtSDate.Text Then
                'do nothing, proceed to next data
            Else
                Dim ACCoverwrite As New OdbcCommand("Update nsk_account SET smartcardid = @mykad, acc_created = @created, acc_modified = @modify WHERE acc_id ='" + localid + "'", serverconn)
                Dim DEToverwrite As New OdbcCommand("Update nsk_accountdetail SET acd_firstname = @name, acd_ic = @newic, acd_oldic = @oldic, acd_race = @race, acd_dob = @dob, acd_rescity = @city, acd_resaddr1 = @address, acd_telmobile = @phone, acd_email = @email, acd_telwork = @language, acd_modified = @detmodify WHERE acd_accid ='" + localid + "'", serverconn)
                ACCoverwrite.ExecuteNonQuery()
                DEToverwrite.ExecuteNonQuery()
            End If
        Next

        MessageBox.Show("Upload success", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)

    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Finally
        localconn.Close()
        serverconn.Close()
    End Try
End Sub

任何评论或建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我希望你的意思是逐桌。我没有多读你的代码,但是你有了这个想法 - 你需要2个连接,但是这里有2个不同的方法。

方式#1 - 你可以在数据量时使用(怎么说更好? - 不是很大)。您可以使用来自服务器的数据加载DataTable对象并更新已更改的记录。您可以使用DataAdapter并发出CommitChanges - 所有已更改/新行都将写入服务器。

  

注意:您需要一种能够可靠地分辨本地数据库中新行和修改行的机制。如果本地数据库中的PK与服务器上的PK不同,你还好吗?你需要回答这些问题。可能你需要一个特殊的PK本地机制。例如,使用负PK整数添加行,这将告诉您这些行是新的。并使用“ModifiedDate”,它与PK一起将告诉行是否需要更新。

方式#2 - 随时使用,即使数据量较大。拿一个本地行检查它。如果是新的 - insert,如果它已存在且“DateModified”已更改,请执行update。有如何做到这一点的变化。您可以使用SQL MERGE语句等

但这些是两种主要方式 - 直接行插入/更新和断开连接更新/批量提交。

此外,您可以使用事务批量执行 - 更新一些rows-commit,然后启动新事务。如果您在更新时使用该应用程序,这将有所帮助。

我希望这些想法有所帮助。如果你做你做的,你在哪里

For Each localid In thedatatable.Rows

我不确定localid是什么。它应该是

' prepare command before loop
sql = "Select * From Table where ID = @1"
' you will create parameter for @1 with value coming from 
' row("ID")
Dim cmd As New .....
cmd.Parameters.Add(. . . . )
For Each row As DataRow In thedatatable.Rows

    cmd.Parameters(0).Value = row("ID") ' prepare command upfront and only change the value
    using reader as IDataReader = cmd.ExecuteReader(. .  . . )
        If Not reader.Read() Then 
            ' This row is not found in DB - do appropriate action
            Continue For
        Else
            ' here check if the date matches and issue update
            ' Better yet - fill some object 
        End if
    end using

    ' if you fill object with data from your row -here you can verify if
    ' update needed and issue it  
     . .  . . . . 

Next