首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle.ManagedDataAccess在C#中的性能

Oracle.ManagedDataAccess在C#中的性能
EN

Stack Overflow用户
提问于 2018-12-27 21:26:54
回答 1查看 519关注 0票数 0

我使用Oracle数据库作为我的后端。对于我的工作流程,我正在构建一个基于用户选择的动态查询。此动态查询从5个不同的表中获取。我正在从所有5个表中获取和读取所有列,这样我也可以从其他地方使用相同的逻辑。

Oracle.ManagedDataAccess.dll用于数据库访问。

代码:

代码语言:javascript
复制
    public class ClassEx
{
    public ClassA ClassA { get; set; }
    public ClassB ClassB { get; set; }
    public ClassC ClassC { get; set; }
    public ClassD ClassD { get; set; }
    public ClassE ClassE { get; set; }

    public List<ClassEx> Select()
    {
        List<ClassEx> ex = new List<ClassEx>();
        string sql = "Select "  + (new ClaasA()).GetFullString("a") + ", "
                    + (new ClaasB()).GetFullString("b") + ", "
                    + (new ClaasC()).GetFullString("c") + ", "
                    + (new ClaasD()).GetFullString("d") + ", "
                    + (new ClaasE()).GetFullString("e") +
                " From Sysadm.TableA a, Sysadm.TableB b, Sysadm.TableC c, Sysadm.TableD d, Sysadm.TableE e" +
                " Where a.Col1 = b.Col2" +
                " And a.Col5 = c.Col2" +
                " And a.Col6 = d.Col2" + 
                " And a.Col10 = e.Col2";

        GenericDataReader dr = new GenericDataReader(sql);

        while(dr.Read())
        {
            ClassEx dummy = new ClassEx();

            dummy.ClassA = new ClassA(dr);
            dummy.ClassB = new ClassB(dr);
            dummy.ClassC = new ClassC(dr);
            dummy.ClassD = new ClassD(dr);
            dummy.ClassE = new ClassE(dr);

            ex.Add(dummy);
        }

        return ex;
    }
}



public ClassA
{
    public int Col1 {get;set;}
    ...
    public DateTime? Col30 {get;set;}

    public ClassA(GenericDataReader dr)
    {
        Col1 = dr.GetInt("A_Col1")
        Col2 = dr.GetString("A_Col2")
        ....
        Col30 = dr.GetDateTime("A_Col30")
    }

    public string GetFullString(string alias)
    {
        if (!String.IsNullOrEmpty(alias))
                    alias = alias + ".";

        return  alias + "A_Col1, " + 
            alias + "A_Col2, " +
            ...
            alias + "A_Col30"
    }
}

public ClassB
{
    public int Col1 {get;set;}
    ...
    public DateTime? Col30 {get;set;}

    public ClassB(GenericDataReader dr)
    {
        Col1 = dr.GetInt("B_Col1")
        Col2 = dr.GetString("B_Col2")
        ....
        Col30 = dr.GetDateTime("B_Col30")
    }

    public string GetFullString(string alias)
    {
        if (!String.IsNullOrEmpty(alias))
                    alias = alias + ".";

        return  alias + "B_Col1, " + 
            alias + "B_Col2, " +
            ...
            alias + "B_Col30"
    }
}

public ClassC
{
    public int Col1 {get;set;}
    ...
    public DateTime? Col25 {get;set;}

    public ClassC(GenericDataReader dr)
    {
        Col1 = dr.GetInt("C_Col1")
        Col2 = dr.GetString("C_Col2")
        ....
        Col25 = dr.GetDateTime("C_Col25")
    }

    public string GetFullString(string alias)
    {
        if (!String.IsNullOrEmpty(alias))
                    alias = alias + ".";

        return  alias + "C_Col1, " + 
            alias + "C_Col2, " +
            ...
            alias + "C_Col25"
    }
}

public ClassD
{
    public int Col1 {get;set;}
    ...
    public DateTime? Col10 {get;set;}

    public ClassD(GenericDataReader dr)
    {
        Col1 = dr.GetInt("D_Col1")
        Col2 = dr.GetString("D_Col2")
        ....
        Col10 = dr.GetDateTime("D_Col10")
    }

    public string GetFullString(string alias)
    {
        if (!String.IsNullOrEmpty(alias))
                    alias = alias + ".";

        return  alias + "D_Col1, " + 
            alias + "D_Col2, " +
            ...
            alias + "D_Col10"
    }
}

public ClassE
{
    public int Col1 {get;set;}
    ...
    public DateTime? Col35 {get;set;}

    public ClassE(GenericDataReader dr)
    {
        Col1 = dr.GetInt("E_Col1")
        Col2 = dr.GetString("E_Col2")
        ....
        Col35 = dr.GetDateTime("E_Col35")
    }

    public string GetFullString(string alias)
    {
        if (!String.IsNullOrEmpty(alias))
                    alias = alias + ".";

        return  alias + "E_Col1, " + 
            alias + "E_Col2, " +
            ...
            alias + "E_Col35"
    }
}

一切都很好。执行查询甚至不需要一秒钟时间。然而,while循环需要40秒才能读取750个记录。这是不能接受的。你能帮我改进一下时间循环吗?我不知道它能以最快的方式阅读所有的记录。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-27 22:21:21

非常感谢朋友们的回应。

我在我的数据阅读器本身发现了一个错误,当我一个接一个地评论掉这个问题的时候。我发现在一种情况下,它总是处于异常状态,因此它会减慢我的数据读取器的速度。

在解决了异常后,现在我在2秒内收到了我的结果。解决了!

再次谢谢:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53951048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档