使用 WebDatabase 从桌面应用程序同步数据库

Sync Database from Desktop Application with WebDatabase

我有一个在 Visual Fox Pro 中构建的桌面应用程序,以及另一个使用 html、css、javascript 和 php 构建的 Web 应用程序。

这些应用程序具有不同的数据库、桌面(interbase) 和网络(MySQL)。我需要在 Web 应用程序中显示来自桌面数据库的数据,为此,我使用一个程序将桌面数据库转换为 Web 数据库的格式,然后我手动上传数据。

有什么方法可以自动完成这个过程吗?

我的意思是,每次在桌面应用程序中输入新数据时,这些数据都会自动转换并上传到 Web 数据库?

感谢您的帮助。

(简单方法) 我使用 csv 格式将数据从 vfp DB 迁移到 mysql。首先,我在 vfp 中创建了一个简单的应用程序,它使用 table 并转换为 csv 文件。然后我通过 PHP 将该文件上传到服务器并使用其功能从 csv 中提取数据并插入到 mysql 数据库中。

(需要更多代码) 正如你们所讨论的那样,我通过 mysql odbc 连接器直接从 vfp 与 mysql 通信,如果您使用带有 vfp 的 sql 服务器,这并不困难,只是需要更改一些日期格式。

我的代码如下(创建数据库)

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

编辑

从 vfp 创建 CSV

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

您可以简单地在本地更新数据,然后使用 mysql odbc 连接器 https://dev.mysql.com/downloads/connector/odbc/ 更新 mysql 中的数据。此方法仅在您的 mysql 可以从 127.0.0.1(localhost) 以外的其他端口侦听时才有效。