首页 > 解决方案 > 如何从 C# 中的 SQLDataReader 以更快的方式获取记录

问题描述

我们有一个存储过程,其结果数据如下。

testCol1    testCol2  testCol3  testCol4  testCol5
 124       1234       4543      4532       5564
 123       1235       4546      4537       5565

它有 190,000 条记录。

我正在尝试获取List<TestData>类型中的数据,然后将其传递给第三方。下面是代码:

public class TestData
{
    public int testCol1 { get; set; }
    public int testCol2 { get; set; } 
    public string testCol3 { get; set; }
    public double? testCol4 { get; set; }
    public int testCol5 { get; set; }
}
var inputs = new List<TestData>();
using (SqlConnection con = new SqlConnection(fitchConnectionString))
using (SqlCommand cmd = new SqlCommand())
{
    cmd.Connection = con;
    cmd.CommandText = "dbo.ReadAll_ForTest";
    cmd.CommandTimeout = 0;
    con.Open();
    using (SqlDataReader dr = new SqlDataReader(cmd.ExecuteReader()))
    {
        while (dr.Read())
        {
            inputs.Add(new TestData()
            {
                testCol1 = (int)dr["testCol1"];
                testCol2 = (int)dr["testCol2"];
                testCol3 =(string)dr["testCol3"];
                testCol4 = (double)dr["testCol4"];
                testCol5 = (int)dr["testCol5"];

            });
        }
    }
}

//pass to third party
var output = thirdparty.Convert(inputs).ToArray();      

它工作正常,但是需要花费大量时间来获取数据。有没有一种方法可以更快地获取数据?

标签: c#

解决方案


一种方法是显式指定类型,这样框架就不必弄清楚你的意思。提前获取序数(索引),并从列中提取确切的类型:

using (var dr = cmd.ExecuteReader())
{
    var testCol1Idx = dr.GetOrdinal("testCol1");
    var testCol2Idx = dr.GetOrdinal("testCol2");
    var testCol3Idx = dr.GetOrdinal("testCol3");
    var testCol4Idx = dr.GetOrdinal("testCol4");
    var testCol5Idx = dr.GetOrdinal("testCol5");

    while (dr.Read())
    {
        inputs.Add(new TestData()
        {
            testCol1 = dr.GetInt32(testCol1Idx);
            testCol2 = dr.GetInt32(testCol2Idx);
            testCol3 = dr.GetString(testCol3Idx);
            testCol4 = dr.GetDouble(testCol4Idx);
            testCol5 = dr.GetInt32(testCol5Idx);
        });
    }
}

除此之外,100K+ 是很多记录。你真的需要所有这些吗?尝试使用数据的子集,或在使用之前聚合数据。


推荐阅读