簡體   English   中英

在c#中實現可更新的記錄集

[英]implement updateable recordsets in c#

在c#中實現可更新記錄集需要什么? 想想可用於Sql CE的東西,但是為Sql Server等其他人實現了。 記錄集類是否基本上實現了99%,並且只需要一些修改來添加它,或者這是一項重大任務? 也許使用Mono的一些代碼並擴展它?

只是fyi,.net 1.1的早期測試版之一(如果我的版本正確)實際上確實實現了這一點,但后來由於害怕濫用而被刪除。 有效的擔憂,但在某些情況下肯定會很方便。

沒有可用於模擬通過實時連接生成和更新的可滾動游標的組件 並且由於一些非常好的理由遠未被濫用。 其中最重要的是它在SQL Server上使用資源非常糟糕。

是的, SqlDataReader確實提供了查詢的快進只讀版本。 此外,閱讀器一次只檢索一行並使連接在整個時間內保持打開狀態。 這允許您獲取非常大的結果集並將資源保留在SQL Server上,並且您可以非常快速地完成。

但是,可以非常輕松地模擬將實時反饋回SQL Server的過程。 要做到這一點,我將推薦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類只是一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM