Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 筛选多址数据库上的数据集以优化结果_C#_.net_Linq_Dataset - Fatal编程技术网

C# 筛选多址数据库上的数据集以优化结果

C# 筛选多址数据库上的数据集以优化结果,c#,.net,linq,dataset,C#,.net,Linq,Dataset,在连接到多个MS access数据库表时,我有以下c代码来过滤当前数据。这可以很好地工作,但由于数据集ds太大,循环需要花费很长时间才能返回检查调用另一个mdb数据库表的每一行。有没有一种方法可以优化它,根据列过滤器删除行 string ABCACCESSDataSource = @"c:\websites\abc.mdb"; string XYZACCESSDataSource = @"c:\websites\xyz.mdb"; private void dataviewTable() {

在连接到多个MS access数据库表时,我有以下c代码来过滤当前数据。这可以很好地工作,但由于数据集ds太大,循环需要花费很长时间才能返回检查调用另一个mdb数据库表的每一行。有没有一种方法可以优化它,根据列过滤器删除行

string ABCACCESSDataSource = @"c:\websites\abc.mdb";
string XYZACCESSDataSource = @"c:\websites\xyz.mdb";

private void dataviewTable()
{
        OleDbConnection Conn = DatabaseCommands.openDBConnection(ABCACCESSDataSource, this);
        string query1 = select column1, column2, column3 from ABCTable where column2 = 'hello' order by column1;
        Dataview dv; 
        OleDbDataAdapter da = new OleDbDataAdapter(query1, Conn);

        DataSet ds = new System.Data.DataSet();
        da.Fill(ds, "ABCTable");

         foreach (DataRow dr in ds.Tables["ABCTable"].Rows)
          checkValue = dr["ABCTable"].ToString();
                        {
                        resultvalue = getvalue(checkValue);
                        if(resultvalue == "unavailable")
                        {
                            dr.delete();
                        }

             dv = ds.Tables["ABCTable"].DefaultView;    
}    

private string getvalue(string checkValuepassed)    
{
        OleDbConnection Conn2 = DatabaseCommands.openDBConnection(XYZACCESSDataSource, this);
        string query2 = select columnX from XYZTable where columnY = 'test' AND columnZ = '" + checkValuepassed +"'" ;;

        OleDbDataAdapter da2 = new OleDbDataAdapter(query2, Conn2);
        ds2 = new DataSet();
                        da2.Fill(ds2);
                        resultVal = ds2.Tables[0].Rows[0][0].ToString() ;

                        return resultVal;
}

第二个数据库XYZ有多大?
如果它适合内存,您可以首先从中选择所有行,而不选择任何columnZ=。。。在字典中,然后在getvalue.中仅执行内存操作,从而节省了大量OleDb查询。

如果您只获取一个值,那么将其放入表中检索值的速度很慢

但是只检索一次值

string query2 = select columnZ, columnX from XYZTable where columnY = 'test' ;;

Dictionary<string, string> table2Dict = new Dictionary<string, string>();

table2Dict.add(columnZ, columnX);

colZvalue = table2Dict[checkValuepassed];
另一种看待这一点的方式不是循环ABC。 只需循环XYZ并向ABC发出delete命令。 如果记录不在那里,它将不删除任何内容。 然后以10-100人为一组进行分组。 这将是一个甜蜜的时刻。
删除[XYX],其中[ABCTable]位于……,中

列名真的是Column1、Column2等等吗?因为我注意到您正在检查列名='hello'表结构是什么样子的。。我建议阅读/用谷歌搜索如何在Access数据库中使用OLEDB这看起来有点马虎。列名像ID、名称、分数等。这并不马虎,而且效果完全好。只是表格结果太大了,我正在尝试对此进行优化。然后更改您的问题来描述这一点。。在我看来,这将使别人更容易给你一个更合理的答案问题并不是太大。5000行很小。问题是对DB的多次调用。我知道这是因为对DB的多次调用,但我无法避免,因为我从第一个DB获得的结果将通过检查传递给第二个DB的每个列值进行过滤,它需要检查每一行,这需要花费太多的时间。每个表中大约5000行!!谢谢你的建议。我将尝试这样做,以便在上面的代码中填充表2,我需要执行for循环,并将每个项的键和值添加到表中?我尝试过这样做,但当我通过ColumnY='test'时得到的结果约为9000行,我需要获得通过checkValuePassed的那一行。您没有跟随。整个想法是获得9000行,并将其放入字典中。您只需触摸表XYZ一次。然后使用table2Dict[checkValuepassed];谢谢你,布拉姆和我所了解到的每一个人,因为布拉姆提到要立即使用字典和存储值。。!!