まず、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 が一般的な選択肢です。