sqlite - 从 Excel 文件到 SQLite 数据库的 SQLite 插入循环
问题描述
首先,我是 SQLite 的新手。
我尝试制作一个 AIR 应用程序,可以将值从 excel 文件导入 SQLite 数据库。我尝试做的是创建一个循环,允许我将数据从 excel 插入 SQLite 数据库。以下是我的代码;
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.SQLEvent;
import flash.events.TimerEvent;
import flash.data.SQLStatement;
import flash.data.SQLConnection;
import flash.utils.Timer;
import flash.filesystem.File;
import flash.net.FileFilter;
import fl.controls.Button;
import fl.controls.DataGrid;
import fl.controls.ScrollPolicy;
import lib.xlsxreader.Worksheet;
import lib.xlsxreader.XLSXLoader;
public class DataTransfer extends MovieClip
{
private var i;
private var fileGet: File = new File();
private var dbFile: File = new File();
private var excel_loader: XLSXLoader = new XLSXLoader();
private var sqlc: SQLConnection = new SQLConnection();
private var sqls: SQLStatement = new SQLStatement();
public function DataTransfer()
{
var btnImport: Button = new Button();
btnImport.x = btnImport.y = 10;
btnImport.label = "Select Excel File";
btnImport.addEventListener(MouseEvent.CLICK, selectExcelFile);
addChild(btnImport);
fileGet = File.applicationDirectory;
fileGet.addEventListener(Event.CANCEL, fileCancel);
fileGet.addEventListener(Event.SELECT, fileSelect);
dbFile = fileGet.resolvePath("test.sqlite");
excel_loader.addEventListener(Event.COMPLETE, loadingComplete);
sqlc.addEventListener(SQLEvent.OPEN, db_opened);
sqlc.openAsync(dbFile);
}
private function selectExcelFile(e: MouseEvent): void
{
var fileFilter = new FileFilter("Select Excel File", "*.xls;*.xlsx;*.xlsm");
fileGet.browseForOpen("Select Excel File", [fileFilter]);
}
private function fileCancel(e: Event): void
{
trace("Cancel");
}
private function fileSelect(e: Event): void
{
trace("File Path is : " + fileGet.nativePath);
excel_loader.load(fileGet.nativePath);
}
private function loadingComplete(e: Event): void
{
var row: int = new int();
var sheet_2: Worksheet = excel_loader.worksheet("Sheet2");
var arColumn1: Array = new Array();
var arColumn2: Array = new Array();
var arColumn3: Array = new Array();
row = sheet_2.rows;
sqls.text = ""
for (i = 1; i <= row; i++)
{
arColumn1[i - 1] = sheet_2.getCellValue("A" + i);
arColumn2[i - 1] = sheet_2.getCellValue("B" + i);
arColumn3[i - 1] = sheet_2.getCellValue("C" + i);
sqls.text = sqls.text + "INSERT INTO test_table (col1) VALUES('" + arColumn1[i - 1] + "');";
}
trace(sqls.text);
sqls.execute();
refresh();
var dtExcel: DataGrid = new DataGrid();
dtExcel.x = 10;
dtExcel.y = 40;
dtExcel.width = 300;
dtExcel.height = 100;
dtExcel.horizontalScrollPolicy = ScrollPolicy.ON;
dtExcel.verticalScrollPolicy = ScrollPolicy.ON;
var col1 = dtExcel.addColumn("Column1");
var col2 = dtExcel.addColumn("Column2");
var col3 = dtExcel.addColumn("Column3");
col1.minWidth = 100;
col2.minWidth = 200;
col3.minWidth = 300;
for (i = 0; i <= row - 1; i++)
{
dtExcel.addItem(
{
Column1: arColumn1[i],
Column2: arColumn2[i],
Column3: arColumn3[i]
});
}
addChild(dtExcel);
}
private function db_opened(e: SQLEvent): void
{
sqls.sqlConnection = sqlc;
sqls.text = "CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY AUTOINCREMENT, col1 TEXT, col2 TEXT, col3 TEXT)";
sqls.execute();
refresh();
}
private function refresh(e: TimerEvent = null): void
{
var timer: Timer = new Timer(10, 1);
timer.addEventListener(TimerEvent.TIMER, refresh);
if (!sqls.executing)
{
sqls.text = "SELECT * FROM test_table";
sqls.execute();
}
else
{
timer.start();
}
}
}
}
我在这条线上有问题;
for (i = 1; i <= row; i++)
{
arColumn1[i - 1] = sheet_2.getCellValue("A" + i);
arColumn2[i - 1] = sheet_2.getCellValue("B" + i);
arColumn3[i - 1] = sheet_2.getCellValue("C" + i);
sqls.text = sqls.text + "INSERT INTO test_table (col1) VALUES('" + arColumn1[i - 1] + "');";
}
我尝试循环,sqls.text
以便可以将 excel 值传递到 SQLite 数据库中。但是sqls.execute()
只执行第一个INSERT
.
我尝试查看sqls.text
using的价值,trace(sqls.text)
我认为我的 SQL 语句是正确的(假设 SQLite 确实使用 PostgreSQL 语法),如下所示;
INSERT INTO test_table (col1) VALUES('saya');INSERT INTO test_table (col1) VALUES('makan');INSERT INTO test_table (col1) VALUES('minum');INSERT INTO test_table (col1) VALUES('');INSERT INTO test_table (col1) VALUES('');INSERT INTO test_table (col1) VALUES('main');
我假设我的语法是正确的,因为我在https://rextester.com/l/postgresql_online_compiler中使用了上述语法并且它工作得很好。
我假设我的循环实现是正确的,因为我的数据网格dtExcel
在正确的列和行中显示了完全正确的值。
我也尝试sqls.execute()
在循环中使用,但出现以下错误:
错误:错误 #3106:当 SQLStatement.executing 为真时,无法更改属性。
有没有办法做这个循环?或者我需要使用开源 AS3 SQLite 库来做到这一点?
编辑:
根据这里,我可以将上面的 SQLite 语法更改为;
INSERT INTO test_table (col1) VALUES('saya'),('makan'),('minum'),(''),(''),('main');
但是,这仍然会出现以下错误;
错误 #2044:未处理的 SQLErrorEvent:。errorID=3115,操作=执行,消息=错误 #3115:SQL 错误。, details=near ',': 语法错误
解决方案
尝试在每个循环中创建一个命令以及准备好的语句中的执行和参数:
for (i = 1; i <= row; i++)
{
arColumn1[i - 1] = sheet_2.getCellValue("A" + i);
arColumn2[i - 1] = sheet_2.getCellValue("B" + i);
arColumn3[i - 1] = sheet_2.getCellValue("C" + i);
sqls.clearParameters();
sqls.text = "INSERT INTO test_table (col1, col2, col3) VALUES(:param1, :param2, :param3)";
sqls.parameters[":param1"] = arColumn1[i - 1];
sqls.parameters[":param2"] = arColumn2[i - 1];
sqls.parameters[":param3"] = arColumn3[i - 1];
sqls.execute();
}
此外,您可以使用事务:
sqls.begin();
- for loop here
sqls.commit();
推荐阅读
- google-sheets-api - 使用 Google Sheets API 折叠组
- java - 从列表的开头和列表的结尾搜索(Java)
- java - 如何从具有多个参数的对象数组列表中出列?
- java - JVM 编译时间与代码缓存
- python - 如何打印内部列表同时包含字符串和字符串列表的列表列表?
- python - 用于读取文本文件并在 excel 中制表的 Python 程序
- python-2.7 - Python:: 定义函数时如何将 %d 插入变量
- wordpress - 数据库重新启动后,Wordpress 样式丢失
- javascript - IE中的React App heroku部署失败
- git - 如何在 Visual Studio Code 并排文件中看到“git diff”?