2016-02-20 4 views
1

Я использую SQLite с C#.SQL метод занимает много времени

Я использую следующий метод для прокрутки списка телешоу и их эпизодов и вставки их в базу данных. Он заканчивается входом около 1200 рядов и занимает 2 минуты 28 секунд. Кажется, что это довольно медленно, поэтому я хотел бы, чтобы люди просматривали мой метод и смотрели, что я делаю что-то глупое (я к этому не привык).

public void InsertAllEpisodes(List<TVDBSharp.Models.Show> showList) 
    { 

     using (SQLiteConnection dbconnection = new SQLiteConnection(connectionString)) 
     { 
      string seasonNumber; 
      string episodeNumber; 
      string insertShowSQL = @"INSERT INTO AllEpisodes (Key, ShowName, ShowId, EpisodeName, SeasonEpisode) VALUES (@Key, @ShowName, @ShowId, @EpisodeName, @SeasonEpisode)"; 

      foreach (var show in showList) 
      { 
       foreach (var episode in show.Episodes) 
       { 
        if (episode.SeasonNumber != 0) 
        { 
         string seasonEpisode = "default"; 
         if ((episode.SeasonNumber != 0) && (episode.SeasonNumber.ToString().Length == 1)) { seasonNumber = "0" + episode.SeasonNumber.ToString(); } 
         else { seasonNumber = episode.SeasonNumber.ToString(); } 
         if (episode.EpisodeNumber.ToString().Length == 1) { episodeNumber = "0" + episode.EpisodeNumber.ToString(); } 
         else { episodeNumber = episode.EpisodeNumber.ToString(); } 
         seasonEpisode = seasonNumber + episodeNumber; 
         SQLiteCommand command = new SQLiteCommand(insertShowSQL, dbconnection); 
         command.Parameters.AddWithValue("Key", show.Id + seasonEpisode); 
         command.Parameters.AddWithValue("ShowName", show.Name); 
         command.Parameters.AddWithValue("ShowId", show.Id); 
         command.Parameters.AddWithValue("EpisodeName", episode.Title); 
         command.Parameters.AddWithValue("SeasonEpisode", seasonEpisode); 
         dbconnection.Open(); 
         try 
         { 
          command.ExecuteScalar(); 
         } 
         catch (SQLiteException ex) 
         { 
          if (ex.ResultCode != SQLiteErrorCode.Constraint) 
          { 
           File.AppendAllText(programDataPath + "SQLErrors.txt", ex.Message + "\n"); 
          } 
         } 
         dbconnection.Close(); 
        } 
       } 

      } 
     } 

    } 
+1

Вы открываете и закрываете соединение с базой данных внутри внутреннего цикла 'foreach' - это должно выполняться вне петель. Кроме того, каков счет 'showList' и' show.Episodes' соответственно? – Rhys

+0

В дополнение к тому, что сказал Райс, сколько строк уже в вашей таблице, и есть ли у вас много индексов на этой таблице? – ohiodoug

+0

@Rhys 6 Shows, 1300 Episodes – Jrow

ответ

0

Я прочитал на и использовал sqlComm = new SQLiteCommand("begin", dbconnection) и sqlComm = new SQLiteCommand("end", dbconnection) и он вставил его менее чем за 1 секунду.

public void InsertAllEpisodes(List<TVDBSharp.Models.Show> showList) 
    { 

     using (SQLiteConnection dbconnection = new SQLiteConnection(connectionString)) 
     { 

      dbconnection.Open(); 
      string seasonNumber; 
      string episodeNumber; 
      string insertShowSQL = @"INSERT INTO AllEpisodes (Key, ShowName, ShowId, EpisodeName, SeasonEpisode) VALUES (@Key, @ShowName, @ShowId, @EpisodeName, @SeasonEpisode)"; 
      SQLiteCommand sqlComm; 
      sqlComm = new SQLiteCommand("begin", dbconnection); 
      sqlComm.ExecuteNonQuery(); 
      foreach (var show in showList) 
      { 
       foreach (var episode in show.Episodes) 
       { 
        if (episode.SeasonNumber != 0) 
        { 
         string seasonEpisode = "default"; 
         if ((episode.SeasonNumber != 0) && (episode.SeasonNumber.ToString().Length == 1)) { seasonNumber = "0" + episode.SeasonNumber.ToString(); } 
         else { seasonNumber = episode.SeasonNumber.ToString(); } 
         if (episode.EpisodeNumber.ToString().Length == 1) { episodeNumber = "0" + episode.EpisodeNumber.ToString(); } 
         else { episodeNumber = episode.EpisodeNumber.ToString(); } 
         seasonEpisode = seasonNumber + episodeNumber; 
         sqlComm = new SQLiteCommand(insertShowSQL, dbconnection); 
         sqlComm.Parameters.AddWithValue("Key", show.Id + seasonEpisode); 
         sqlComm.Parameters.AddWithValue("ShowName", show.Name); 
         sqlComm.Parameters.AddWithValue("ShowId", show.Id); 
         sqlComm.Parameters.AddWithValue("EpisodeName", episode.Title); 
         sqlComm.Parameters.AddWithValue("SeasonEpisode", seasonEpisode); 
         try 
         { 
          sqlComm.ExecuteScalar(); 
         } 
         catch (SQLiteException ex) 
         { 
          if (ex.ResultCode != SQLiteErrorCode.Constraint) 
          { 
           File.AppendAllText(programDataPath + "SQLErrors.txt", ex.Message + "\n"); 
          } 
         } 

        } 
       } 

      } 
      sqlComm = new SQLiteCommand("end", dbconnection); 
      sqlComm.ExecuteNonQuery(); 
      dbconnection.Close(); 

     } 

    } 
Смежные вопросы