C#和SQLite:资源到数组

时间:2012-12-29 20:10:19

标签: c# sqlite

我用SQLite查询数据库。我试图从数据库中获取数据,将其保存在数组中并返回控制器。然后我需要在我看来使用foreach来呈现这些数据。

string sql = "select * from Tasks Where UserId = " + userId.ToString();
using (SQLiteConnection conn = new SQLiteConnection(connString))    
{
    SQLiteCommand cmd = new SQLiteCommand(sql, conn);
    conn.Open();
    using (SQLiteDataReader rdr = cmd.ExecuteReader()) 
    {
        int i = 0;
        while (rdr.Read()) 
        {
            //here is what i would do in PHP
            $array[$i]['name'] = $rdr[i]["name"];
            $array[$i]['key']  $rdr[$i]["key"];
        }
    }
}

return array;

请在代码时提供帮助。

1 个答案:

答案 0 :(得分:4)

首先,学会使用参数化查询而不是字符串连接,因为这有助于防止SQL注入攻击。

string sql = "select * from Tasks Where UserId = @userId";

此外,如果您创建一个类来表示Tasks表中的记录,那么您可以构建此对象的实例并将其返回到列表中,这将使代码更容易使用,因为它不是使用无类型数组,您将拥有一个包含属性的对象(在您的视图中,您可以foreach (var task in Model) ModelList<Task>

public class Task
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Key { get; set; }
}

var tasks = new List<Task>(); // create a list to populate with tasks

using (var connection = new SQLiteConnection(connString))    
{
    var command = new SQLiteCommand(sql, conn);
    command.Parameters.Add("@userId", userId); // only do .ToString on userId if the column is a string.

    connection.Open();
    using (var reader = cmd.ExecuteReader()) 
    {
        while (reader.Read()) 
        {
            var task = new Task();
            task.Id = (int)reader["id"]; // the name of the column in the reader will match the column in the Tasks table.
            task.Name = (string)reader["name"];
            task.Key = (string)reader["key"];

            tasks.Add(task);
        }
    }
}

return tasks;

您可以使用名为Object Relational Mappers (ORM)的框架为您执行此操作,而不是编写所有查询逻辑和创建对象。它们中有很多,有些比其他更简单。 MicroORM可能适合您的目的,它们简单易用(我已经构建了一个名为MicroLite但还有其他如dapper或PetaPoco。如果您想要更强大的东西,NHibernate和Entity Framework是受欢迎的选择。