我用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;
请在代码时提供帮助。
答案 0 :(得分:4)
首先,学会使用参数化查询而不是字符串连接,因为这有助于防止SQL注入攻击。
string sql = "select * from Tasks Where UserId = @userId";
此外,如果您创建一个类来表示Tasks
表中的记录,那么您可以构建此对象的实例并将其返回到列表中,这将使代码更容易使用,因为它不是使用无类型数组,您将拥有一个包含属性的对象(在您的视图中,您可以foreach (var task in Model)
Model
为List<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是受欢迎的选择。