2016-12-18 8 views
0

私はdbに保存したいレコードの数を持っています。
データベースのスキーマは、この
このような人のテーブルのようなものです:私は両方に挿入を行うには、この機能を使用挿入時にsqlite.netのパフォーマンスを向上させます

CREATE TABLE IF NOT EXISTS File (id INTEGER PRIMARY KEY, FileName TEXT,FilePath TEXT, PersonID NUMERIC CONSTRAINT person_file REFERENCES [Person]([id])ON DELETE NO ACTION ON UPDATE NO ACTION) 


:このような

CREATE TABLE IF NOT EXISTS Person (id INTEGER PRIMARY KEY, name TEXT) 

とファイルテーブルテーブル


3700レコードこのコードでは1約500秒 私はトランザクション内で第二は、ExecuteNonQueryをラップしようとしたが、だけでなく、パフォーマンスの向上は、それが500を取った私のラップトップ上で40秒、

public long BuildDB(List<DB.Person> persons, List<DB.File> Files, FrmTrain form) 
     { 
      long result = -1; 
      try 
      { 

       long personID = 0; 
       using (SQLiteConnection sqlconnection = new SQLiteConnection("Data Source=" + DbPath + ";Version=3;")) 
       { 
        sqlconnection.Open(); 
        SQLiteCommand PersonCommand = sqlconnection.CreateCommand(); 
        SQLiteParameter personParam = new SQLiteParameter(); 
        PersonCommand.CommandText = "INSERT INTO Person('Name') VALUES(?)"; 
        PersonCommand.Parameters.Add(personParam); 


        SQLiteCommand FileCommand = sqlconnection.CreateCommand(); 
        SQLiteParameter FileParam1 = new SQLiteParameter("@filename"); 
        SQLiteParameter FileParam2 = new SQLiteParameter("@filepath"); 
        SQLiteParameter FileParam3 = new SQLiteParameter("@personid"); 

        FileCommand.CommandText = "INSERT INTO file(FileName,FilePath,PersonID) VALUES(@filename,@filepath,@personid)"; 
        FileCommand.Parameters.Add(FileParam1); 
        FileCommand.Parameters.Add(FileParam2); 
        FileCommand.Parameters.Add(FileParam3); 
        for (int i = 0; i < persons.Count; i++) 
        { 
         using (SQLiteTransaction _SQLiteTransaction = sqlconnection.BeginTransaction()) 
         { 
          personParam.Value = persons[i].Name; 
          PersonCommand.ExecuteNonQuery(); 
          personID = sqlconnection.LastInsertRowId; 

          foreach (var item in Files.Where(f => f.PersonID == personID)) 
          { 
           FileParam1.Value = item.FileName; 
           FileParam2.Value = item.FilePath; 
           FileParam3.Value = item.PersonID; 
           FileCommand.ExecuteNonQuery(); 

          } 
          _SQLiteTransaction.Commit(); 
         } 
         form.Progress(); 
        } 
        sqlconnection.Close(); 
       } 
       result = 1; 

      } 
      catch (Exception e) 
      { 
       result = 0; 
       throw; 
      } 



      return result; 

     } 
最初


iは、トランザクションなしでそのコードを書き、それがかかりましたもう一度

とにかくパフォーマンスを向上させるにはありますか?

+0

大量挿入を調べるべきでしょう – mybirthname

+0

personテーブルのpkが整数のときに、ファイルテーブルのpersonidがnumeric型であるのはなぜですか?これらのSQL @rene – rene

+0

がたSQLiteManagerによって生成されたプラスそれは本当に問題のsqliteをデータベース –

答えて

0

1人のSQLiteTransactionと、挿入されたすべての人物に対して1つのコミットだけを使用してください。

 try 
     { 

      long personID = 0; 
      using (SQLiteConnection sqlconnection = new SQLiteConnection("Data Source=" + DbPath + ";Version=3;")) 
      { 
       sqlconnection.Open(); 
       SQLiteCommand PersonCommand = sqlconnection.CreateCommand(); 
       SQLiteParameter personParam = new SQLiteParameter(); 
       PersonCommand.CommandText = "INSERT INTO Person('Name') VALUES(?)"; 
       PersonCommand.Parameters.Add(personParam); 


       SQLiteCommand FileCommand = sqlconnection.CreateCommand(); 
       SQLiteParameter FileParam1 = new SQLiteParameter("@filename"); 
       SQLiteParameter FileParam2 = new SQLiteParameter("@filepath"); 
       SQLiteParameter FileParam3 = new SQLiteParameter("@personid"); 

       FileCommand.CommandText = "INSERT INTO file(FileName,FilePath,PersonID) VALUES(@filename,@filepath,@personid)"; 
       FileCommand.Parameters.Add(FileParam1); 
       FileCommand.Parameters.Add(FileParam2); 
       FileCommand.Parameters.Add(FileParam3); 
       using (SQLiteTransaction _SQLiteTransaction = sqlconnection.BeginTransaction()) 
       { 
        for (int i = 0; i < persons.Count; i++) 
        { 
         personParam.Value = persons[i].Name; 
         PersonCommand.ExecuteNonQuery(); 
         personID = sqlconnection.LastInsertRowId; 

         foreach (var item in Files.Where(f => f.PersonID == personID)) 
         { 
          FileParam1.Value = item.FileName; 
          FileParam2.Value = item.FilePath; 
          FileParam3.Value = item.PersonID; 
          FileCommand.ExecuteNonQuery(); 
         } 
        } 
        _SQLiteTransaction.Commit(); 
        form.Progress(); 
       } 
       sqlconnection.Close(); 
      } 
      result = 1; 

     } 
     catch (Exception e) 
     { 
      result = 0; 
      throw; 
     } 
関連する問題