【问题标题】:Database Sync - Local and Online without Replication数据库同步 - 本地和在线,无需复制
【发布时间】:2019-01-21 23:01:54
【问题描述】:

所以我有这个code,它通过比较online and local database 的rows 来检查是否将新数据添加到online database。如果找到新数据,它会将新数据插入到local database。

public class Reservation
{
    public string res_no { get; set; }
    public string mem_fname { get; set; }
}

我的代码:

private async void updateDineList()
    {
            DBconnector.OpenConnection();

            //Gets data from online database
            HttpClient client = new HttpClient();
            var response = await client.GetStringAsync("http://example.com/Reservation/view_pending_reservation");
            var persons = JsonConvert.DeserializeObject<List<Reservation>>(response);

            //Gets data from Local database
            string string_reservation = "SELECT res_no,mem_fname  FROM res_no WHERE res_status='pending';";
            DataTable reservation_table = new DataTable();
            MySqlDataAdapter adapter_reservartion = new MySqlDataAdapter(string_reservation, DBconnector.Connection);
            adapter_reservartion.Fill(reservation_table);

            //Gets the row of each table
            int local = reservation_table.Rows.Count;
            int online = persons.Count;

            //Compares rows of online and local database
            if (local < online)
            {   
            //if the rows of online database is greater than local database
            //inserts the new data from local database
                string Command_membership = "INSERT INTO reservation_details (res_no,mem_fname) VALUES (@res_no, @mem_fname);";                    
                for (int i = local; i < online; i++)
                {
                    //inserts new data from online to local database
                    using (MySqlCommand myCmd = new MySqlCommand(Command_membership, DBconnector.Connection))
                    {
                        myCmd.CommandType = CommandType.Text;
                        myCmd.Parameters.AddWithValue("@res_no", persons[i].res_no);
                        myCmd.Parameters.AddWithValue("@mem_fname", persons[i].mem_fname);
                        myCmd.ExecuteNonQuery();
                    }
                }
                MessageBox.Show("New Records Found");
            }
            else
            {
                MessageBox.Show("No new Records");
            }

            DBconnector.Connection.Close();
    }

所以我的问题是这段代码可能会出现任何问题,它工作正常,但有什么办法可以改进它。我知道 MySQL 复制更好,但我只使用免费的Web Hosting,很少有 MySQL 权限。

【问题讨论】:

  • 这取决于您如何使用这两个数据库,它们都添加了什么,以及为什么。复制和同步功能的存在是有原因的,它的构建是可靠的并且具有已知的数量。廉价解决方案的问题在于,您会得到廉价且有时出乎意料的结果。您的代码做了它所做的事情,并且没有明显的疏忽,因为我们不知道系统用法和域,我怀疑我们是否会采用这种问答格式。我建议(如果您不想进行此复制并且设计用于执行此操作的实用程序)试用它并查看
  • 无论如何我投票结束这个问题,因为它更像是一个代码审查,有点过于宽泛,并且对于本网站的精神来说质量低下
  • 谢谢先生,感谢您的回答。也许生病尝试购买 vps 来执行复制。

标签: c# php database mysql-8.0


【解决方案1】:

明显的改进不是为每一行创建一个新命令。您应该创建一次命令和参数,然后设置参数并为每一行调用,或者更好地将更新集打包到一个结构中,例如和 xml 字符串,然后通过存储的过程调用。

其他可能有问题的问题是您纯粹根据行数进行检查。不知道这在您的场景中是否有效,但听起来很危险。如果行被删除怎么办?或者这在你的场景中是不可能的。检查最后更新的其他方式可能会更好。

没有更多的上下文,这就是我所能看到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2016-08-22
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多