Nano Hash - криптовалюты, майнинг, программирование

Синхронизация базы данных из настольного приложения с WebDatabase

У меня есть сборка настольного приложения в Visual Fox Pro и другая сборка веб-приложения с html, css, javascript и php.

Эти приложения имеют разные базы данных, настольные (interbase) и веб-(MySQL). Мне нужно отобразить данные из базы данных рабочего стола в веб-приложении, и для этого я использую программу для преобразования базы данных рабочего стола в формат веб-базы данных, а затем загружаю данные вручную.

Есть ли способ сделать этот процесс автоматически?

Я имею в виду, каждый раз, когда новые данные вводятся в настольное приложение, эти данные автоматически преобразуются и загружаются в веб-базу данных?

Спасибо за помощь.


  • Есть ли причина, по которой два приложения не могут просто общаться с одной и той же базой данных? 22.06.2016
  • Да, настольное приложение — это устаревшее приложение, которое я не могу изменить в базе данных прямо сейчас. Мне нужно обновить как настольную, так и веб-базу данных, когда что-то вводится или обновляется в настольной версии. Есть ли способ? 23.06.2016
  • Если у вас есть лиса (может быть, С#, я не программирую на этом языке), вы можете написать процедуру, которая обращается к таблицам лисы, использует драйвер mysql odbc и помещает данные в базу данных mysql. У меня есть программное обеспечение в производстве, которое делает именно это, поэтому, если вам нужны еще идеи, вы можете написать мне в личку. 23.06.2016
  • Привет, @Hank, я не знаю, сможем ли мы связаться здесь, в SO, но мне интересно узнать больше. Можете ли вы дать мне свой контакт или открыть чат здесь? Мне не хватает репутации. Спасибо. 23.06.2016
  • Лиоо, вы можете связаться со мной по адресу [email protected] 23.06.2016

Ответы:


1

(Простой метод) Я использую формат csv для переноса данных из базы данных vfp в mysql. Сначала я создал простое приложение в vfp, которое использует таблицу и преобразует ее в файл csv. Затем я загружаю этот файл на сервер через PHP и использую его функцию для извлечения данных из csv и вставки в базу данных mysql.

(Требуется еще код) Как вы, ребята, обсуждали, я напрямую общаюсь с mysql из vfp через соединитель mysql odbc, это не так сложно, если вы используете сервер sql с vfp, просто нужно изменить какой-то формат даты.

Мои коды ниже (Создать базу данных)

LPARAMETERS par_table, par_extra_field, par_after
IF VARTYPE(par_table) <> "C" OR LEN(ALLTRIM(par_table)) = 0
    MESSAGEBOX("Table Not Found to Export", 16, "Table")
    RETURN
ENDIF
IF VARTYPE(par_extra_field) <> "C"
    par_extra_field = ""
ENDIF
IF VARTYPE(par_after) <> "C"
    par_after = ""
ENDIF
DO mysql_connect    && this file connect to mysql database and return hconnAZ as connection
sele (par_table)
ncount = AFIELDS(arr_fields)
SQL_NEW_TABLE = [CREATE TABLE IF NOT EXISTS ] + par_table + [(] +     par_extra_field
FOR i = 1 TO FCOUNT()
    DO CASE
        CASE arr_fields(i, 2) = "L"
        var_type = " tinyint "
    CASE arr_fields(i, 2) = "C"
        var_type = " char(" + ALLTRIM(STR( arr_fields(i, 3) )) + ") "
    CASE arr_fields(i, 2) = "N"
        IF arr_fields(i, 3) = 1 AND arr_fields(i, 4) = 0
            var_type = " boolean "
        ELSE
            var_type = " decimal(" + ALLTRIM(STR( arr_fields(i, 3) )) + ;
                    IIF(arr_fields(i, 4) > 0, ", " + ALLTRIM(STR( arr_fields(i, 4) )), ",0") + ") "
        ENDIF
    CASE arr_fields(i, 2) = "D"
        var_type = " date "
    CASE arr_fields(i, 2) = "T"
        var_type = " datetime "
    CASE arr_fields(i, 2) = "I"
        var_type = " integer "

ENDCASE
SQL_NEW_TABLE = SQL_NEW_TABLE + [`] + arr_fields(i, 1) + [`] + var_type  + [ NOT NULL ] + IIF(i = FCOUNT(), [)], [,] )
ENDFOR
SQL_NEW_TABLE = SQL_NEW_TABLE + par_after
_cliptext = SQL_NEW_TABLE 
MESSAGEBOX( SQLEXEC(hconnAZ, SQL_NEW_TABLE ) )
SQLDISCONNECT(hconnAZ)

(Загрузка данных в базу данных mysql)

LPARAMETERS par_table, par_extra_field, par_extra_value
IF VARTYPE(par_table) <> "C" OR LEN(ALLTRIM(par_table)) = 0
    MESSAGEBOX("Table Not Found to Export", 16, "Table")
    RETURN
ENDIF
sele (par_table)
SET DELETED ON
ncount = AFIELDS(arr_fields)
SQL_INSERT = ["INSERT INTO ] + par_table + [(]
len_insert = LEN(SQL_INSERT)
FOR i = 1 TO FCOUNT()
SQL_INSERT = SQL_INSERT + [`] + arr_fields(i, 1) +[`] + IIF(i <> FCOUNT(), [,], [])
len_insert = len_insert + LEN([`] + arr_fields(i, 1) +[`] + IIF(i <> FCOUNT(), [,], []))
IF len_insert > 200
    len_insert = 0
    SQL_INSERT = SQL_INSERT + [" + "]
ENDIF
ENDFOR
IF VARTYPE(par_extra_field) = "C" AND NOT EMPTY(par_extra_field)
SQL_INSERT = SQL_INSERT + [, `] + par_extra_field + [`]
ENDIF
SQL_INSERT = SQL_INSERT + [) VALUES (" + ]
st = ["'"+] 
en = [+"'"]
FOR i = 1 TO FCOUNT()
var_f_data = st + par_table + [.] + arr_fields(i, 1) + en
DO CASE
    CASE arr_fields(i, 2) = "C"
        var_f_data = st + [ ALLTRIM(] + par_table + [.] + arr_fields(i, 1) + [)]+ en
    CASE arr_fields(i, 2) = "L"
        var_f_data = [ IIF(] + par_table + [.] + arr_fields(i, 1) + [, '1', '0')  ]
    CASE arr_fields(i, 2) = "N" OR arr_fields(i, 2) = "I" 
        var_f_data = [ ALLTRIM(STR(] + par_table + [.] + arr_fields(i, 1) + [)) ]
    CASE arr_fields(i, 2) = "D"
        var_f_data = st + [ LEFT(TTOC(] + par_table + [.] + arr_fields(i, 1) + [, 3), 10) ] + en
    CASE arr_fields(i, 2) = "T"
        var_f_data  = st + [ LEFT(TTOC(]+ par_table + [.] + arr_fields(i, 1) + [, 3), 10)] + " + SPACE(1) + " + ;
                [RIGHT(TTOC(] + par_table + [.] + arr_fields(i, 1) + [, 3), 8) ] + en

ENDCASE
SQL_INSERT = SQL_INSERT + var_f_data + IIF(i = FCOUNT(), [], [+","+] )
ENDFOR
IF VARTYPE(par_extra_value) = "C" AND NOT EMPTY(par_extra_value)
SQL_INSERT = SQL_INSERT + [+","+"'] + ALLTRIM(par_extra_value) + ['"]
ENDIF
SQL_INSERT = SQL_INSERT + [+")"]

DO mysql_connect
sele (par_table)
total_rec = ALLTRIM(STR(RECCOUNT()))
SCAN
SQL_INSERT_Final = &SQL_INSERT
_cliptext=&SQL_INSERT
t = SQLEXEC(hconnAZ, SQL_INSERT_Final)
IF t <> 1
    SCATTER MEMVAR
    _cliptext = SQL_INSERT_Final
    file_unposted = par_table+"_unposted"+".dbf"
    IF NOT FILE(file_unposted)
        COPY STRUCTURE TO &file_unposted
    ENDIF
    IF NOT USED( JUSTSTEM(file_unposted))
        USE &file_unposted IN 0
    ENDIF
    SELECT (file_unposted)
    APPEND BLANK
    GATHER MEMVAR FIELDS EXCEPT ID_NO
ENDIF
sele (par_table)
t = ALLTRIM(STR(RECNO())) + " / " + total_rec
WAIT t WINDOW AT 0, 0 NOWAIT NOCLEAR
ENDSCAN

SQLDISCONNECT(hconnAZ)

(Mysql_Connect)

PUBLIC hconnAZ
sql_driver  = "MySQL ODBC 5.3 ANSI Driver"
*sql_driver = "MySQL ODBC 3.51 Driver"  &&older version
data_source = "localhost"
database    = "az"
userid      = "root"
password    = ""
CStringAZ="DRIVER={"+sql_driver+"};SERVER="+data_source+";PORT=3306;DATABASE="+database+"; USER="+userid+";PASSWORD="+password+";OPTION=3;"
hconnAZ = SQLSTRINGCONNECT(CStringAZ)
IF hconnAZ <= 0
= MESSAGEBOX('Cannot make connection with Database.', 16, 'Database  Connection Error')
ENDIF

ИЗМЕНИТЬ

создать CSV из vfp

CLOSE ALL
var_file = GETFILE("dbf", "File to Export", "Export")
var_dir = GETDIR() + "\"+ JUSTSTEM(var_file)+".csv"
USE &var_file IN 0
SELECT JUSTFNAME(var_file)
SET SAFETY OFF
DELETE FILE &var_dir
SET SAFETY ON

COPY TO &var_dir TYPE DELIMITED

Загрузите файл и вставьте в код mysql

<?php
include("db_connect.inc");      // connect to mysql
function import_from_csv()
{
echo "
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">
";
echo "
<HTML>
<HEAD>
<TITLE>Import Data from CSV File</TITLE>
</HEAD>
<BODY>
<form id=\"form1\" name=\"form1\" enctype=\"multipart/form-data\" method=\"post\" action=\"".$_SERVER['PHP_SELF']."?type=post\">
    <table width=\"90%\" border=\"2\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" >
            <tr valign = \"centre\">
                <td height = \"50\" colspan=\"4\" bgcolor=\"#E6E6E6\" align =\"center\" > 
                    <h3></br>Import Data from CSV File</h3>
                </td>
            </tr>
    </table>
    <table width=\"85%\" align=\"center\" >
            <tr>
                <td align=\"center\"><BR>       
                    <!-- MAX_FILE_SIZE must precede the file input field -->
                    <input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"20000000\" />
                    <!-- Name of input element determines name in $_FILES array -->
                    <input type=\"file\" name=\"CSVFile\" value=\"\" size=\"60\"/><BR>
                    <input type=\"submit\" name=\"Submit\" value=\"Import Data\" />
                </td>
            </tr>
    </table>
</form>
</body>
</html>";
}


if (isset($_POST['Submit']) )
{
    $uploaddir = '../';
    $uploadfile = $uploaddir . basename($_FILES['CSVFile']['name']);
    if (move_uploaded_file($_FILES['CSVFile']['tmp_name'], $uploadfile)) {
    //    echo "File is valid, and was successfully uploaded.\n";
    } else {
        echo '<pre>';
        echo "File Not Uploaded Successfully";
        print_r($_FILES);
        exit();
        print "</pre>";
    }
        $table_CHART_CREATE = query_sql($conn, "        
        CREATE TABLE IF NOT EXISTS `chartofacc` (
            `CO_CODE` varchar(4) NOT NULL DEFAULT ''
            PRIMARY KEY (`CO_CODE`)
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
        ");             

    $sql = 'REPLACE INTO chartofacc (ACC_CODE) VALUES ';

    $row = 0;
    $handle = fopen($uploadfile, "r");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
    {   
        $sql .= (($row == 0) ? '' : ', ')."('".$data[1]."')";

        $row++;
    }
    query_sql($conn, $sql);  // my own defined function (just mysqli code to execute query)
}
else import_from_csv() ;
?>

ИЗМЕНИТЬ 2

Вы можете просто обновить данные локально, а затем использовать соединитель odbc mysql https://dev.mysql.com/downloads/connector/odbc/ , обновить данные в mysql. Этот метод будет работать только в том случае, если ваш mysql может прослушивать другие порты, кроме 127.0.0.1 (localhost).

02.07.2016
  • Привет! Используя метод CSV, как вы загружаете данные на сервер с помощью PHP и VFP? 03.07.2016
  • О, я вижу... Там вы создали php, который имеет функцию загрузки, делая это вручную (поправьте меня, если я ошибаюсь), но мне действительно нужен был способ сделать эту загрузку автоматически, в то же время время, когда я сохраняю информацию в локальной базе данных 04.07.2016
  • Я думаю, вы должны использовать задание cron в php. Сначала вы должны обновить данные локально, а затем в то же время сделать csv из vfp (не обязательно полный dbf, некоторый диапазон может быть определен в экспорте csv). Задание cron будет запускаться через определенный период (скажем, каждую минуту) и обновлять этот csv в mysql. 04.07.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..