2016-03-22 64 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