簡體   English   中英

SQLite PCL數據庫插入花費太多時間

[英]SQLite PCL database insertion taking too much time

    namespace App3
    {

        public sealed partial class App : Application
        {
            private TransitionCollection transitions;

            public App()
            {
                this.InitializeComponent();
                this.Suspending += this.OnSuspending;

            }


            public static async Task ReadFile(String file1, String table1)
            {
                using (var connection = new SQLiteConnection("Storage.db"))
                {
                    string a;
                    var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(file1));
                    var stream = await file.OpenStreamForReadAsync();
                    using (StreamReader sr = new StreamReader(stream))
                    {
                        while (sr.Peek() >= 0)
                        {
                            a = sr.ReadLine();
                            string[] l = a.Split(',');
                            if (table1 == "commercial")
                            {
                                using (var statement = connection.Prepare(@"INSERT INTO " + table1 + " VALUES (\'" + l[0] + "\',\'" + l[1] + "\',\'" + l[2] + "\',\"" + l[3] + "\",\"" + l[4] + "\",\'" + l[5] + "\',\'" + l[6] + "\',\'"
                                    + l[7] + "\',\'" + l[8] + "\',\'" + l[9] + "\',\'" + l[10] + "\'); ON DUPLICATE UPDATE ID=ID"))
                                {
                                    statement.Step();
                                    statement.Reset();
                                    statement.ClearBindings();                   
                                }
                            }
                            else
                            {
                                using (var statement = connection.Prepare(@"INSERT INTO " + table1 + " VALUES (\'" + l[0] + "\',\'" + l[1] + "\',\'" + l[2] + "\',\"" + l[3] + "\",\"" + l[4] + "\",\'" + l[5] + "\',\'" + l[6] + "\',\'"
                                    + l[7] + "\',\'" + l[8] + "\',\'" + l[9] + "\'); ON DUPLICATE UPDATE ID=ID"))
                                {
                                    // Inserts data.
                                    statement.Step();
                                    statement.Reset();
                                    statement.ClearBindings();
                                }
                            }
                        }
                    }
                }
            }


            public void createdb(String table){
                using (var connection = new SQLiteConnection("Storage.db"))
                {


  using (var statement1 = connection.Prepare(@"DROP TABLE IF EXISTS " + table+";"))
            {
                statement1.Step();
                statement1.Reset();
                statement1.ClearBindings();
            }
                    using (var statement = connection.Prepare(@"
                                                   CREATE TABLE IF NOT EXISTS "+table+" (id INT NOT NULL PRIMARY KEY,"
                                                      + "TYPE VARCHAR(255),"
                                                      +"MAKE VARCHAR(255),"
                                                      +"MODEL VARCHAR(255),"
                                                      +"Fitment VARCHAR(255),"
                                                      +"Part VARCHAR(255),"
                                                      +"NRB_No VARCHAR(255),"
                                                      +"Dimension VARCHAR(255),"
                                                      +"No_Off INT,"
                                                      +"Company VARCHAR(255)"
                                                    +");"))
                    {
                        statement.Step();

                    }
                }
            }


            protected async override void OnLaunched(LaunchActivatedEventArgs e)
            {

                createdb("Moped");
                await ReadFile("ms-appx:///Assets/Mopeds.txt", "Moped");

                createdb("Scooter");
                await ReadFile("ms-appx:///Assets/Scooters.txt", "Scooter");

                createdb("Motorcycle");
                await ReadFile("ms-appx:///Assets/Motorcycles.txt", "Motorcycle");

                createdb("Auto");
                await ReadFile("ms-appx:///Assets/3W.txt", "Auto");

                createdb("Passenger");
                await ReadFile("ms-appx:///Assets/cars.txt", "Passenger");

                createdb("Muv");
                await ReadFile("ms-appx:///Assets/Muv.txt", "Muv");

                createdb("Commercial");
                await ReadFile("ms-appx:///Assets/Commercial.txt", "Commercial");

                createdb("Tractor");
                await ReadFile("ms-appx:///Assets/Tractors.txt", "Tractor");

  }

這是我的App.xaml.cs,我將在啟動方法中添加表格。 該表是使用本地文件夾中存在的文本文件填充的。 但是插入需要太多時間。 每次插入大約有300行和9個條目,但這需要時間。 有沒有辦法加快速度? 我做對了還是有其他方法可以使用該數據庫。我正在使用SQLITE PCL,這適用於Windows 8.1 RT

編輯

public static async Task ReadFile(String file1, String table1)
        {
            using (var connection = new SQLiteConnection("Storage.db"))
            {
                string a;
                var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(file1));
                var stream = await file.OpenStreamForReadAsync();
                using (StreamReader sr = new StreamReader(stream))
                {
                    while (sr.Peek() >= 0)
                    {
                        a = sr.ReadLine();
                        string[] l = a.Split(',');
                        try
                        {
                            using (var tr = connection.BeginTransaction())
                            {
                                using (SQLiteCommand cmd = connection.CreateCommand(@"DROP TABLE IF EXISTS " + table1 + ";"))
                                {
                                    cmd.ExecuteNonQuery();
                                }

                                if (table1 == "commercial")
                                    {        
                                        using (SQLiteCommand cmd1 = connection.CreateCommand(@"
                                               CREATE TABLE IF NOT EXISTS " + table1 + " (id INT NOT NULL PRIMARY KEY,"
                                                  + "TYPE VARCHAR(255),"
                                                  + "MAKE VARCHAR(255),"
                                                  + "MODEL VARCHAR(255),"
                                                  + "Fitment VARCHAR(255),"
                                                  + "Part VARCHAR(255),"
                                                  + "NRB_No VARCHAR(255),"
                                                  + "Dimension VARCHAR(255),"
                                                  + "No_Off INT,"
                                                  + "Company VARCHAR(255)"
                                                + ");"))
                                        {
                                            cmd1.ExecuteNonQuery();
                                        }

                                        using (SQLiteCommand cmd = connection.CreateCommand(@"INSERT INTO " + table1 + " VALUES (\'" + l[0] + "\',\'" + l[1] + "\',\'" + l[2] + "\',\"" + l[3] + "\",\"" + l[4] + "\",\'" + l[5] + "\',\'" + l[6] + "\',\'"
                                        + l[7] + "\',\'" + l[8] + "\',\'" + l[9] + "\',\'" + l[10] + "\'); ON DUPLICATE UPDATE ID=ID"))
                                        {
                                            cmd.ExecuteNonQuery();
                                        }
                                    }
                                    else
                                    {
                                        using (SQLiteCommand cmd1 = connection.CreateCommand(@"
                                               CREATE TABLE IF NOT EXISTS " + table1 + " (id INT NOT NULL PRIMARY KEY,"
                                                  + "TYPE VARCHAR(255),"
                                                  + "MAKE VARCHAR(255),"
                                                  + "MODEL VARCHAR(255),"
                                                  + "Fitment VARCHAR(255),"
                                                  + "Part VARCHAR(255),"
                                                  + "NRB_No VARCHAR(255),"
                                                  + "Dimension VARCHAR(255),"
                                                  + "No_Off INT,"
                                                  + "Company VARCHAR(255)"
                                                  + "Usage VARCHAR(255)"
                                                + ");"))
                                        {
                                            cmd1.ExecuteNonQuery();
                                        }
                                        using (SQLiteCommand cmd = connection.CreateCommand(@"INSERT INTO " + table1 + " VALUES (\'" + l[0] + "\',\'" + l[1] + "\',\'" + l[2] + "\',\"" + l[3] + "\",\"" + l[4] + "\",\'" + l[5] + "\',\'" + l[6] + "\',\'"
                                            + l[7] + "\',\'" + l[8] + "\',\'" + l[9] + "\'); ON DUPLICATE UPDATE ID=ID"))
                                        {
                                            // Inserts data.
                                            cmd.ExecuteNonQuery();
                                        }
                                    }
                                    tr.Commit();
                            }
                        }
                            catch (SQLiteException ex)
                            {
                               tr.Rollback();
                            }
                        }
                    }
                }
            }

確保將插入內容包裝在顯式打開並提交的事務中 否則,SQLite會將每個語句包裝在自己的事務中,這會降低性能。 HTH。

編輯 :另外,看看有關SQLite性能的一般問題

我知道這已經很晚了,但我在SQLite.Net-PCL庫中也遇到了同樣的問題。 我在事務下一個接一個地插入記錄,這就是為什么要花3-4分鍾才能插入7k記錄的原因。 現在,我正在使用InsertAll函數,它最多可以減少到10秒。 這是我的代碼:

_connection.BeginTransaction();
                    var listPeople = new List<Table_People>();
                    foreach (var item in peopleList.People)
                    {
                        var peopleTable = new Table_People();
                        peopleTable.AccountNumber = item.AccountNumber;
                        peopleTable.FirstName = item.FirstName;
                        peopleTable.LastName = item.LastName;
                        peopleTable.MiddleName = item.MiddleName;
                        peopleTable.PersonID = item.ID;
                        listPeople.Add(peopleTable);
                        //_peopleManager.SaveTask(peopleTable);
                    }
                    _connection.InsertAll(listPeople);
                    _connection.Commit();

快樂的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM