从Excel文件到SQLite数据库的SQLite插入循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Excel文件到SQLite数据库的SQLite插入循环相关的知识,希望对你有一定的参考价值。

首先,我是SQLite的新手。

我尝试制作一个可以将excel文件中的值导入SQLite数据库的AIR应用程序。我想做的是做一个循环,使我可以将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查看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为true时无法更改属性。

是否有方法可以执行此循环?还是我需要使用开源AS3 SQLite库来做到这一点?

编辑:

根据here,我可以将上述SQLite语法更改为;

INSERT INTO test_table (col1) VALUES('saya'),('makan'),('minum'),(''),(''),('main');

但是,这仍然给出以下错误;

错误#2044:未处理的SQLErrorEvent :。 errorID = 3115,操作=执行,message =错误#3115:SQL错误。 ,details =在','附近:语法错误

答案

尝试在每个循环中以及在准备好的语句中与执行和参数一起使一个命令:

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();

以上是关于从Excel文件到SQLite数据库的SQLite插入循环的主要内容,如果未能解决你的问题,请参考以下文章

如何批量导入数据到Sqlite数据库

excel里面的数据如何导入SQLite3

Python解析excel文件并存入sqlite数据库

Excel-VBA 通过 ODBC 驱动程序到 SQLite3:主数据库 + 附加数据库

用SQLiteManager软件怎么实现把excel里的数据导入到sqlite

以编程方式将 SQLite 数据导出到 iOS 中的 Excel