当我想将数据从本地数据库更新为服务器数据时,我将面临一个问题,替换在本地数据库中修改过的所有内容。我知道这可能很简单,但我对此一无所知,所以任何帮助都会受到赞赏。
在我的情况下,我想使用一个按钮将所有修改过的数据上传到 服务器数据库。现在,我只是在同一台服务器上使用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
任何评论或建议都将不胜感激。
答案 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