PHP - 将 SQL CE 文件转换为 SQLITE 很慢



美好的一天!

我在 PHP 脚本执行缓慢时遇到问题。我不确定这是否是有效的问题。请耐心等待。

我的任务是创建一个Web应用程序,将现有的SDF文件(SQL Server CE(转换为DB(SQlite文件(。我正在使用PHP。

SQlite数据库将用于移动应用程序。

这是我的转换步骤:

  1. 用户可以选择单个或多个SDF文件。
  2. 我将首先连接到该SDF文件。我找到了一个非常有用的脚本。 使用 PHP 阅读 SQL Compact Edition (* .sdf(
  3. 我将创建 SQLite 数据库文件并创建所需的表。
  4. 我会从 SDF 中选择数据,然后将数据插入到 SQLite 数据库中各自的表中。

如果用户选择了多个文件,我将不得不重复此过程。

这是我的代码供您参考:

/**
* ARBalances
*/
$file_db->exec("CREATE TABLE IF NOT EXISTS ARBalances (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
CustomerCode NVARCHAR(10),
BillingDate TEXT,
Balance DECIMAL(15,2),
SalesId NVARCHAR(30),
Amount DECIMAL(18,2),
Payment DECIMAL(18,2))");


/**
* Insert Data to db file. Select ARBalances from SDF file
*/
$sdf->execute("SELECT * FROM ARBalances");
$this->data_array = [
'customer_code' => NULL,
'billing_date' => NULL,
'balance' => NULL,
'sales_id' => NULL,
'amount' => NULL,
'payment' => NULL,
];
$ar_balances = [];
while (!$sdf->eof()) {
$ar_balances[$sdf->fieldvalue('SalesId')] = $this->data_array;
$ar_balances[$sdf->fieldvalue('SalesId')]['customer_code'] = $sdf->fieldvalue('CustomerCode');
$date = str_replace('/', '-', $sdf->fieldvalue('BillingDate'));
$date = new DateTime($date);
$billing_date = strtotime($date->format('Y-m-d H:i:s'));
$billing_date = (int)$billing_date * 1000;
$ar_balances[$sdf->fieldvalue('SalesId')]['billing_date'] = $billing_date;
$ar_balances[$sdf->fieldvalue('SalesId')]['balance'] = (float)$sdf->fieldvalue('Balance');
$ar_balances[$sdf->fieldvalue('SalesId')]['sales_id'] = (string)$sdf->fieldvalue('SalesId');
$ar_balances[$sdf->fieldvalue('SalesId')]['amount'] = (float)$sdf->fieldvalue('Amount');
$ar_balances[$sdf->fieldvalue('SalesId')]['payment'] = (float)$sdf->fieldvalue('Payment');
$sdf->movenext();
}
$insert = "INSERT INTO ARBalances(CustomerCode, BillingDate, Balance, SalesId, Amount, Payment)
VALUES (:customer_code, :billing_date, :balance, :sales_id, :amount, :payment)";
$stmt = $file_db->prepare($insert);
$stmt->bindParam(':customer_code', $customer_code);
$stmt->bindParam(':billing_date', $billing_date);
$stmt->bindParam(':balance', $balance);
$stmt->bindParam(':sales_id', $sales_id);
$stmt->bindParam(':amount', $amount);
$stmt->bindParam(':payment', $payment);
foreach ($ar_balances as $value) {
$customer_code = $value['customer_code'];
$billing_date = $value['billing_date'];
$balance = $value['balance'];
$sales_id = $value['sales_id'];
$amount = $value['amount'];
$payment = $value['payment'];
$stmt->execute();
}

该代码仅适用于ARBalances表。我在数据库中有 38 个表。有些表有 200+ 条记录。我的执行时间需要 5 分钟 ust 进行一次转换!我不知道这是否正常,但我认为这需要太长时间。

我认为 while 循环是导致此问题的原因。老实说,我对计算机科学概念或循环优化并不熟悉。

希望你能帮助我如何优化我的代码。任何建议将不胜感激。希望我解释清楚自己。多谢。

您希望将 sqlite 插入包装为事务。 您可以在以下位置找到更多信息: http://www.sqlitetutorial.net/sqlite-php/transaction/

最新更新