C# で更新可能なレコードセットを実装するには何が必要ですか? Sql CE で利用できるものを考えてみてください。レコードセット クラスは基本的にこれの 99% を実装しており、それを追加するには多少の調整が必要ですか? おそらく、Mono のコードを使用して拡張するのでしょうか。
参考までに、.net 1.1 の初期のベータ版の 1 つ (私のバージョンが正しければ) は実際にこれを実装していましたが、悪用を恐れて後で削除されました。妥当な懸念ですが、特定のシナリオでは確かに便利です。
C# で更新可能なレコードセットを実装するには何が必要ですか? Sql CE で利用できるものを考えてみてください。レコードセット クラスは基本的にこれの 99% を実装しており、それを追加するには多少の調整が必要ですか? おそらく、Mono のコードを使用して拡張するのでしょうか。
参考までに、.net 1.1 の初期のベータ版の 1 つ (私のバージョンが正しければ) は実際にこれを実装していましたが、悪用を恐れて後で削除されました。妥当な懸念ですが、特定のシナリオでは確かに便利です。
ライブ接続を介して生成および更新するスクロール可能なカーソルを模倣するために使用できるコンポーネントはありません。そして、虐待からほど遠いいくつかの非常に正当な理由があります。特に重要なことは、SQL Server のリソースの使用が非常に貧弱であるという事実です。
はい、クエリの早送りおよび読み取り専用バージョンをSqlDataReader
提供します。さらに、リーダーは一度に 1 つの行のみを取得し、接続をずっと開いたままにします。これにより、非常に大きな結果セットを取得してリソースを SQL Server に残すことができ、非常に迅速に行うことができます。
ただし、SQL Server へのライブフィードバックを作成するプロセスは、非常に簡単にシミュレートできます。これを行うには、次の 2 つの理由からDapperをお勧めします。
まず、非常に単純な例から始めましょう。テーブルがあるとします。
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);
しかし、他に何も変わりません!