2016-03-22 65 views
0

我有一個按時間順序按升序時間戳排序的製表符分隔文件。每行有7列。每列是一個參數。Sqlite如何保留INSERT的順序

我有一個sqlite數據庫,我從選項卡文件中插入行作爲批量INSERT命令中的參數。例如:

public void Create(IEnumerable<Game> items) 
{ 
    var sbFields = new StringBuilder(); 
    sbFields.Append("ID,"); 
    sbFields.Append("LEAGUE,"); 
    sbFields.Append("VISITORTEAM,"); 
    sbFields.Append("HOMETEAM,"); 
    sbFields.Append("DATETIME,"); 
    sbFields.Append("VISITORSCORE,"); 
    sbFields.Append("HOMESCORE"); 

    int numAppended = 7; 

    var sbParams = new StringBuilder(); 
    for (int i = 1; i <= numAppended; i++) 
    { 
     sbParams.Append("@param"); 
     sbParams.Append(i); 

     if (i < numAppended) 
     { 
      sbParams.Append(", "); 
     } 
    } 

    using (var command = new SQLiteCommand(Db)) 
    { 
     command.CommandText = "INSERT OR IGNORE INTO GAMES (" + sbFields + ") VALUES(" + sbParams + ")"; 
     command.CommandType = CommandType.Text; 

     using (var transaction = Db.BeginTransaction()) 
     { 
      foreach (var game in items) 
      { 
       command.Parameters.Add(new SQLiteParameter("@param1", game.Id)); 
       command.Parameters.Add(new SQLiteParameter("@param2", game.League)); 
       command.Parameters.Add(new SQLiteParameter("@param3", game.VisitorTeam)); 
       command.Parameters.Add(new SQLiteParameter("@param4", game.HomeTeam)); 
       command.Parameters.Add(new SQLiteParameter("@param5", game.Date.Ticks)); 
       command.Parameters.Add(new SQLiteParameter("@param6", game.VisitorScore)); 
       command.Parameters.Add(new SQLiteParameter("@param7", game.HomeScore)); 

       command.ExecuteNonQuery(); 
      } 

      transaction.Commit(); 
     } 
    } 
} 

我希望,當我檢索,這將是在相同的順序,我做的插入數據庫的遊戲列表(按時間順序),而不是:其實它是在幾乎是隨機的順序。因此,我必須在從數據庫中讀取遊戲列表後對遊戲列表進行排序。而且這個操作非常緩慢。我不想排序。我想按照與INSERT相同的順序讀取它。

這可能嗎?注意:我做的不是想要添加一個新的參數(列)來表示順序。這似乎是一個人爲的解決方案,我乞求未來的問題。

這裏是我從數據庫中讀取數據:

public IEnumerable<Game> Read() 
{ 
    List<Game> enumerable = new List<Game>(); 

    using (var command = new SQLiteCommand(Db)) 
    { 
     command.CommandText = "SELECT * FROM GAMES"; 
     command.CommandType = CommandType.Text; 

     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       Game game = new Game(); 

       game.Id = reader.GetInt32(0); 
       game.League = reader.GetString(1); 
       game.VisitorTeam = reader.GetString(2); 
       game.HomeTeam = reader.GetString(3); 
       game.Date = new DateTime(reader.GetInt64(4)); 
       //game.Date = DateTime.FromFileTimeUtc(Convert.ToInt64(reader.GetInt64(4))); 
       game.VisitorScore = Convert.ToInt32(reader.GetInt32(5)); 
       game.HomeScore = Convert.ToInt32(reader.GetInt32(6)); 

       enumerable.Add(game); 
      } 
     } 
    } 

    return enumerable; 
} 

下面是表CREATE:

public void CreateTable() 
{ 
    string sql = 
     @"CREATE TABLE IF NOT EXISTS GAMES(
             ID    INTEGER      PRIMARY KEY,            
             LEAGUE   TEXT      NOT NULL,                 
             VISITORTEAM  TEXT      NOT NULL,                 
             HOMETEAM  TEXT      NOT NULL,                 
             DATETIME  INTEGER      NOT NULL, 
             VISITORSCORE INTEGER      NOT NULL, 
             HOMESCORE  INTEGER      NOT NULL 
             )"; 

    // if the database table already exists, this will throw an exception. 
    using (var command = new SQLiteCommand(sql, Db)) 
    { 
     command.ExecuteNonQuery(); 
    } 
} 

如何我目前的排序(太慢)

public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource, TKey> 
(this IEnumerable<TSource> source, 
Func<TSource, TKey> keySelector, 
bool descending) 
    { 
     return descending ? source.OrderByDescending(keySelector) 
          : source.OrderBy(keySelector); 
    } 

使用:

games = games.OrderByWithDirection(x => x.Date.Ticks, false).ToList(); 
+0

SELECT * FROM GAMES ORDER BY ID –

+0

該ID是一個散列並且不保證次序 – sapbucket

+0

顯示錶定義。 –

回答

0

是否有任何理由不在數據庫中插入「按時間順序排序的時間戳」以及在檢索結果時按該列排序?

在數據庫中維護基於訂單的訂單的順序並不是一個好主意。列和行都應該能夠以任何順序出現,數據庫不關心這個,也不應該。

我在一個項目中遇到了類似的問題,最後,我用你想避免的解決方案,即索引列。這是因爲我需要改變索引的可能性。是的,我同意解決方案是icky。

+0

表中的DateTime是自1900年1月1日以來的數字刻度。是否有快速排序的方法?我目前正在使用我添加到帖子中的代碼片段(請參閱上文)進行排序。它非常緩慢。 – sapbucket

+0

只需按SQL查詢中的該列進行排序即可。 command.CommandText =「SELECT * FROM GAMES ORDER BY DATETIME」; – naslund

+0

我也試過了你的排序方法與100K假「遊戲」沒有任何性能打擊。花了32毫秒對這個列表進行排序(任何現實值都立即排序),所以我不確定你是否已經在這裏指出了問題。 – naslund