4

C# で更新可能なレコードセットを実装するには何が必要ですか? Sql CE で利用できるものを考えてみてください。レコードセット クラスは基本的にこれの 99% を実装しており、それを追加するには多少の調整が必要ですか? おそらく、Mono のコードを使用して拡張するのでしょうか。

参考までに、.net 1.1 の初期のベータ版の 1 つ (私のバージョンが正しければ) は実際にこれを実装していましたが、悪用を恐れて後で削除されました。妥当な懸念ですが、特定のシナリオでは確かに便利です。

4

1 に答える 1

2

ライブ接続を介して生成および更新するスクロール可能なカーソルを模倣するために使用できるコンポーネントはありません。そして、虐待からほど遠いいくつかの非常に正当な理由があります。特に重要なことは、SQL Server のリソースの使用が非常に貧弱であるという事実です。

はい、クエリの早送りおよび読み取り専用バージョンをSqlDataReader提供します。さらに、リーダーは一度に 1 つの行のみを取得し、接続をずっと開いたままにします。これにより、非常に大きな結果セットを取得してリソースを SQL Server に残すことができ、非常に迅速に行うことができます。

ただし、SQL Server へのライブフィードバックを作成するプロセスは、非常に簡単にシミュレートできます。これを行うには、次の 2 つの理由からDapperをお勧めします。

  1. その性能は他に類を見ません。
  2. とても軽量で使いやすいです

最初はシンプルにしましょう...

まず、非常に単純な例から始めましょう。テーブルがあるとします。

CREATE TABLE Foo (
    ID INT PRIMARY KEY IDENTITY(1, 1),
    Field1 FLOAT,
    Field2 VARCHAR(50)
)

それでは、 からデータを取得しましょうFoo。ただし、その前に、データを配置するための単純なモデルが必要です。

public class Foo
{
    public int ID { get; set; }
    public float Field1 { get; set; }
    public string Field2 { get; set; }
}

そして今、いくつかのデータを取得する必要があります:

using Dapper;

...

public void ReadFoo()
{
    IDbConnection conn = new SqlConnection("[some connection string]");
    conn.Open();
    var list = conn.Query<Foo>("SELECT * FROM Foo");

    // and now you have a list of Foo objects you can iterate against
}

では、データを更新しましょう。

さて、Dapper を使用してデータを取得する方法がわかったので、データベースへのライブストリームをシミュレートする方法を見てみましょう。まず、基本クラスを作成しましょう。

public class DapperModelBase
{
    public abstract string PKField { get; }

    protected void OnPropertyValueChanged(string propertyName, object val)
    {
        var sql = string.Format("update {0} set {1} = @value where {2} = @id",
            this.GetType().Name,
            propertyName,
            this.PKField);

        IDbConnection conn = new SqlConnection("[some connection string]");
        conn.Execute(sql, new
            {
                value = val,
                id = this.GetType().GetProperty(this.PKField).GetValue(this, null)
            });
    }
}

Fooそのため、クラスを少し変更する必要があります。

public class Foo
{
    // implement the abstract property
    public string PKField { get { return "ID"; } }
    public int ID { get; set; }

    private float _field1;
    public float Field1
    {
        get { return _field1; }
        set
        {
            _field1 = value;
            OnPropertyValueChanged("Field1", value);
        }
    }

    private string _field2;
    public string Field2
    {
        get { return _field2; }
        set
        {
            _field2 = value;
            OnPropertyValueChanged("Field2", value);
        }
    }
}

そのため、反復中に編集可能なプロパティを更新すると、これをライブフィードにするコマンドが返されます。

// and now you have a list of Foo objects you can iterate against
foreach (var foo in list)
{
    ...
    ...
    foo.Field1 = 123f; // sends an update
    ...
    ...
    foo.Field2 = "Hello World!" // sends an update
}

ここで、これをさらに一歩進めて、返される結果セットが大量であると仮定しましょう。ここで言うときは、数百 MB を意味します。Dapper はそれも処理できます。データを取得する行を次のように変更するだけです。

var list = conn.Query<Foo>("SELECT * FROM Foo");

に:

var list = conn.Query<Foo>("SELECT * FROM Foo", buffered: false);

しかし、他に何も変わりません!

于 2013-01-10T19:26:17.787 に答える