Синхронизация локальной базы данных и удаленной базы данных с использованием php и c #? - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу синхронизировать и обновлять локальную базу данных и удаленную базу данных одновременно.У владельца есть четыре ресторана (A, B, C, D) в разных местах.Он поддерживает одинаковую цену на продукты и одинаковое качество во всех четырех ресторанах.Поэтому он использует удаленную базу данных для изменения цены, которая влияла на измененную цену во всех филиалах.Все четыре ветви и удаленный сервер имеют одинаковую структуру базы данных и одинаковые таблицы (то есть: ветвь имеет записи и другую ветвь. Каждая ветвь каждой таблицы уникально идентифицируется полями id и branch (id + branch as composite key).

Пример таблицы (покупка)

+----+--------+------------+------------+-----+--------------------+---------------------+
| id | branch | item       | unit_price | qty |      added_on      |     last_updated    |
+----+--------+------------+------------+-----+--------------------+---------------------+
| 1  |   A    | Pizza      |   800      |  5  |2018-12-05T15:47:54 | 2018-05-11T15:47:54 |
+----+--------+------------+------------+-----+--------------------+---------------------+
| 2  |   A    | Chicken    |   350      |  5  |2018-12-05T15:49:54 | 2018-05-11T15:50:54 |
+----+--------+------------+------------+-----+--------------------+---------------------+
| 2  |   B    | cappuccino |   280      |  7  |2018-12-05T15:47:24 | 2018-05-11T15:47:24 |
+----+--------+------------+------------+-----+--------------------+---------------------+

У меня есть следующий код для извлечения вновь добавленной записи и обновленной записи (с полями added_on и last_updated) из локальногоЗатем базу данных загружают и импортируют в удаленную базу данных с таймером. Здесь проверенное время для извлечения записей из локальной базы данных сохраняется в файле, который будет использоваться таймером.

Теперь, чтобы обновлятьЛокальная база данных (загрузить другие записи филиала) в каждой ветви, как я могу загрузить вновь вставленные записи и обновленные записи с удаленного сервера?

php-скрипт на удаленном сервере (для вставки в удаленную базу данных) (выполнить.php)

<code><?php

try
  {
    $connect    = mysqli_connect("localhost", "username", "password", "database");
    $query      = '';
    $table_data = '';
    $filename   = "app_restaurant.json";

    $data  = file_get_contents($filename);
    $array = json_decode($data, true);

    foreach ($array as $set)
      {
        $tblName = $set['tableName'];
        if (sizeof($set['rows']) > 0)
          {
            $query   = '';
            $colList = array();
            $valList = array();
            //  Get list of column names
            foreach ($set['rows'][0] as $colName => $dataval)
              {
                $colList[] = "`" . $colName . "`";
              }
            $query .= "INSERT INTO `" . $tblName . "` \n";
            $query .= "(" . implode(",", $colList) . ")\nVALUES\n";
            //  Go through the rows for this table.
            foreach ($set['rows'] as $idx => $row)
              {
                $colDataA = array();
                //  Get the data values for this row.
                foreach ($row as $colName => $colData)
                  {
                    $colDataA[] = "'" . $colData . "'";
                  }
                $valList[] = "(" . implode(",", $colDataA) . ")";
              }
            //  Add values to the query.
            $query .= implode(",\n", $valList) . "\n";

            //  If id column present, add ON DUPLICATE KEY UPDATE clause
            if (in_array("`id`", $colList))                                    
              {
                $query .= "ON DUPLICATE KEY UPDATE\n\t";                        
                $tmp = array();
                foreach ($colList as $idx => $colName)
                  {
                    //$tmp[] = $colName." = new.".$colName." ";
                    // Changed the following line to get value from current insert row data
                    $tmp[] = $colName . " = VALUES(" . $colName . ") ";     
                  }
                $query .= implode(",", $tmp) . "\n";
              }
            else
              {
                echo "<p><b>`id`</b> column not found. <i>ON DUPLICATE KEY UPDATE</i> clause <b>NOT</b> added.</p>\n";
                echo "<p>Columns Found:<pre>" . print_r($colList, true) . "
\ n ";} echo"

Запрос вставки:

$query
"; $ r = mysqli_query ($ connect, $ query); echo mysqli_errno($ connect). ":",mysqli_error ($ connect)."\ П";эхо "

".mysqli_affered_rows ($ connect)."Строки добавлены в. $ TblName.

";} else {echo "

Нет строк для вставки. $ tblName.

";}}} catch (Exception $ e) {echo $ e-> getMessage ();}?>

загрузчик файлов (upload.php)

<?php
    $filepath = $_FILES["file"]["tmp_name"];
    move_uploaded_file($filepath,"app_restaurant.json");
?>

1.создание файла JSON из локальной базы данных

private void btnExportJson_Click(object sender, EventArgs e)
        {
            string filePath = @"C:\Users\testeam-PC\Desktop\app_restaurant.json";

            if(File.Exists(filePath))
            {
                MessageBox.Show("Sorry! The file is already exists, Please restart the operation","File Exists");
                File.Delete(filePath);
            }
            else
            {
                MySQL mysql = new MySQL();

                var source_result = false;
                source_result = mysql.check_connection(myConString);

                if (source_result == false)
                {
                    MessageBox.Show("Sorry! Unable to connect with XAMP / WAMP or MySQL.\n Please make sure that MySQL is running.", "Local Database Connection Failure");
                }
                else
                {
                    // MessageBox.Show("Connected");
                    int count = 0;

                    using (var connection = new MySqlConnection(myConString))
                    {
                        connection.Open();

                        // get the names of all tables in the chosen database
                        var tableNames = new List<string>();
                        using (var command = new MySqlCommand(@"SELECT table_name FROM information_schema.tables where table_schema = @database", connection))
                        {
                            command.Parameters.AddWithValue("@database", "app_restaurant");
                            using (var reader = command.ExecuteReader())
                            {
                                while (reader.Read())
                                    tableNames.Add(reader.GetString(0));
                            }
                        }

                        // open a JSON file for output; use the streaming JsonTextWriter interface to avoid high memory usage
                        using (var streamWriter = new StreamWriter(filePath))

                        // For seperate lines may be huge capacity
                        using (var jsonWriter = new JsonTextWriter(streamWriter) { Formatting = Newtonsoft.Json.Formatting.Indented, Indentation = 2, IndentChar = ' ' })
                        //using (var jsonWriter = new JsonTextWriter(streamWriter) )
                        {
                            // one array to hold all tables
                            jsonWriter.WriteStartArray();

                            foreach (var tableName in tableNames)
                            {
                                //MessageBox.Show(tableName);
                                count += 1;

                                // an object for each table
                                jsonWriter.WriteStartObject();
                                jsonWriter.WritePropertyName("tableName");
                                jsonWriter.WriteValue(tableName);
                                jsonWriter.WritePropertyName("rows");

                                // an array for all the rows in the table
                                jsonWriter.WriteStartArray();

                                // select all the data from each table
                                using (var command = new MySqlCommand(@"SELECT * FROM " + tableName + " WHERE (last_updated >= '" + local_checked_time + "') OR (added_on >= '" + local_checked_time + "')", connection))
                                using (var reader = command.ExecuteReader())
                                {
                                    while (reader.Read())
                                    {
                                        // write each row as a JSON object
                                        jsonWriter.WriteStartObject();
                                        for (int i = 0; i < reader.FieldCount; i++)
                                        {
                                            jsonWriter.WritePropertyName(reader.GetName(i));
                                            jsonWriter.WriteValue(reader.GetValue(i));
                                        }
                                        jsonWriter.WriteEndObject();
                                    }
                                }
                                jsonWriter.WriteEndArray();
                                jsonWriter.WriteEndObject();
                            }

                            jsonWriter.WriteEndArray();
                            MessageBox.Show("Totally " + count + " tables circulated", "Success");
                            btnUploadToServer.Enabled = true;
                            // Application.Exit();
                            //btnUploadToServer_Click(sender, e);
                        }
                    }
                }
            }
        }

2. загрузить файл JSON на сервер

   private void btnUploadToServer_Click(object sender, EventArgs e)
    {
        bool connection = NetworkInterface.GetIsNetworkAvailable();
        if (connection == true)
        {
            //MessageBox.Show("Internet Available");
            try
            {
                using (WebClient client = new WebClient())
                {
                    string filePath = @"C:\Users\testeam-PC\Desktop\app_restaurant.json";
                    var myUri = new Uri(@"http://youraddress.com/path/upload.php");
                    client.UploadFile(myUri, filePath);
                    client.Credentials = CredentialCache.DefaultCredentials;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
            MessageBox.Show("Successfully Uploaded", "Success");
            btnExecuteURL.Enabled = true;
            // btnExecuteURL_Click(sender, e);
        }
        else
        {
            MessageBox.Show("There is no internet connection.\n Please make sure that you have an internet connection.", "No Internet");
        }
    }

3. Выполнить файл

private void btnExecuteURL_Click(object sender, EventArgs e) {
    bool connection = NetworkInterface.GetIsNetworkAvailable();
    if (connection == true) {
        //MessageBox.Show("Internet Available");
        try {
            // Launch the execution code...
            System.Diagnostics.Process.Start("http://youraddress.com/path/execute.php");
        }
        catch(Exception err) {
            MessageBox.Show(err.Message);
        }
    }

    else {
        MessageBox.Show("There is no internet connection.\n Please make sure that you have internet connection.", "No Internet");
    }
}
...