Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何最大限度地减少OleDbDataAdapter从远程数据库获取数据的时间_C#_.net_Winforms_Oledb_Oledbdataadapter - Fatal编程技术网

C# 如何最大限度地减少OleDbDataAdapter从远程数据库获取数据的时间

C# 如何最大限度地减少OleDbDataAdapter从远程数据库获取数据的时间,c#,.net,winforms,oledb,oledbdataadapter,C#,.net,Winforms,Oledb,Oledbdataadapter,我的Windows窗体应用程序包含OleDbDataAdapter,从远程数据库获取数据需要更长的时间。它无法检索/保存5000行这样的表数据(应用程序被击中)。这是我的密码 environments = ConfigurationManager.GetSection("Environment") as NameValueCollection; string strConnString = environments[envs]; conn = new OleDbConnection(strCon

我的Windows窗体应用程序包含OleDbDataAdapter,从远程数据库获取数据需要更长的时间。它无法检索/保存5000行这样的表数据(应用程序被击中)。这是我的密码

environments = ConfigurationManager.GetSection("Environment") as NameValueCollection;
string strConnString = environments[envs];
conn = new OleDbConnection(strConnString);
conn.Open();
OleDbDataAdapter objDa = new OleDbDataAdapter("select * from tblABC", conn);
DataSet ds1 = new DataSet();
objDa.Fill(ds1);
dataGridView1.DataSource = ds1.Tables[0];
在app.config文件中配置了环境部分:

<configuration>
  <configSections>
    <section name ="Environment" type="System.Configuration.NameValueSectionHandler" />
  </configSections>

  <Environment>
    <add key ="CIT" value ="Password=pwd123;User ID=abc123;Data Source=db1;Persist Security Info=True;Provider=MSDAORA"/>
    <add key ="SIT" value ="Password=pwd234;User ID=abc234;Data Source=db2;Persist Security Info=True;Provider=MSDAORA"/>
    <add key ="UAT" value ="Password=pwd345;User ID=abc345;Data Source=db3;Persist Security Info=True;Provider=MSDAORA"/>

  </Environment>
</configuration>


如果有人能提出更好的代码方法/机制,那就太好了。

以下是一些ADO.NET优化技巧:

  • 请确保您确实需要所有字段,而不是执行
    选择*
    。问题是可能会检索到许多未使用的字段值,这会消耗资源
例如,如果您的表包含的字段多于这三个字段,请执行
选择字段1、字段2、字段3
而不是
选择*

  • 坚持以下连接打开/关闭模式:
例如:

using(var con = new OleDbConnection(strConnString))
{
    con.Open();

    ...

    con.Close();
}
因此,即使发生错误,连接也会关闭,并且该机制将在服务器端使用

  • 物体要快得多。请尝试使用DbDataReader而不是DbDataAdapter。使用它填充一个通用列表,然后将DataGrid绑定到该列表

但是,您的连接本身似乎有问题。如何确保应用程序正在获取数据或尝试建立连接?要检查这一点,请将查询更改为非常快速的查询,如“select sysdate from dual”,以检查问题是否来自连接尝试。

是否尝试使用线程。在程序中的某个地方创建一个子函数,如下所示

public void dataPullingThread(){
    try{
        //your connection code goes here like below//
        environments = ConfigurationManager.GetSection("Environment") as NameValueCollection;
        string strConnString = environments[envs];
        conn = new OleDbConnection(strConnString);
        conn.Open();
        OleDbDataAdapter objDa = new OleDbDataAdapter("select * from tblABC", conn);
        DataSet ds1 = new DataSet();
        objDa.Fill(ds1);
        dataGridView1.DataSource = ds1.Tables[0];
        conn.Close();
    }
    catch (Exception e){

    }

}



//call your thread from desired location in program///

using System.Threading;
Thread thread = new Thread (new ThreadStart(dataPullingThread));
thread.start;

//Your application will continuously run; however, the data will appear when ever the thread auto kills itself. You can boost the speed if you create more then one thread. That means each thread selecting different rows of the database, I hope this information will help you//

到底发生了什么?您确定与数据库的连接正常吗?如果您执行“从..中选择前10个*”,是否有效?我已连接并能够在DB上执行命令。1.每次执行命令时,我都会看到我的应用程序与数据库建立了连接。2.我的应用程序在检索更多记录时会消耗更多的时间(比如1000多条记录)。需要尽量减少这一时间即使我对断开连接的体系结构和大量与数据相关的支持对象也很满意。但在几次“实时”实施之后,所有的快乐都消失了。根据我的经验,我自己在使用ADO.NET时创建了某些规则。1.永远不要将所有内容加载到数据集中(不从表中选择*)。仅选择所需的列。2.如果您知道表中的行数将超过数千行,请以分页方式加载它。4.始终使用存储过程,而不是内联查询。5.使用SSMS、执行计划并优化SP内的查询。“每次执行命令时,我都会看到我的应用程序新连接到DB。”-每次使用它时,你都应该关闭连接-最好使用“using”语句。如果你绝对需要所有数据,最初可以直接获取前200行,然后在新线程中在后台以静默方式获取其余线程。这会让你的用户参与进来,让你的UI保持互动。此外,您每次可以检索200行的数据块。我非常确定应用程序是否连接到数据库。我已经调试并检查了连接状态,并运行了一些命令,包括“SELECTSYSDATE from dual”。让我试试DbDataReader-希望我看到您连接到Oracle数据库。您可能希望查看是否可以一次返回较小的数据子集,例如5 x 1000条记录,以查看这是否有帮助。您可能还想查看从中获取数据的表的索引,以确保SELECT WHERE语句使用索引(如果该表非常大)。我们如何返回要在dataGridView上显示的小数据子集?你是指寻呼概念吗?如果不分页,您能提供一些代码来返回较小的数据子集吗?您对DbDataReader的建议在一定程度上有效。Thank@LarryODP.Net提供了一些批量获取数据的选项,您还可以设置获取大小,这将确保您可以在后台获取大量数据。它有助于优化读取操作我们如何创建不同的线程来选择数据库的不同行?