[英]implement updateable recordsets in c#
在c#中實現可更新記錄集需要什么? 想想可用於Sql CE的東西,但是為Sql Server等其他人實現了。 記錄集類是否基本上實現了99%,並且只需要一些修改來添加它,或者這是一項重大任務? 也許使用Mono的一些代碼並擴展它?
只是fyi,.net 1.1的早期測試版之一(如果我的版本正確)實際上確實實現了這一點,但后來由於害怕濫用而被刪除。 有效的擔憂,但在某些情況下肯定會很方便。
沒有可用於模擬可通過實時連接生成和更新的可滾動游標的組件。 並且由於一些非常好的理由遠未被濫用。 其中最重要的是它在SQL Server上使用資源非常糟糕。
是的, SqlDataReader
確實提供了查詢的快進和只讀版本。 此外,閱讀器一次只檢索一行並使連接在整個時間內保持打開狀態。 這允許您獲取非常大的結果集並將資源保留在SQL Server上,並且您可以非常快速地完成。
但是,可以非常輕松地模擬將實時反饋回SQL Server的過程。 要做到這一點,我將推薦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
類只是一個tidge:
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
}
現在,讓我們更進一步,讓我們假設你回來的結果集是巨大的 ,當我說我的意思是100的MB。 好吧,Dapper也可以處理它,只需更改從以下位置獲取數據的行:
var list = conn.Query<Foo>("SELECT * FROM Foo");
至:
var list = conn.Query<Foo>("SELECT * FROM Foo", buffered: false);
但沒有別的變化!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.