[英]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.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.