3

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;
4

1 に答える 1

5

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

于 2012-12-29T20:27:17.820 に答える