-1

我有以下 c# 代码来过滤当前数据,同时连接到多个 MS 访问数据库表。这工作正常,但由于 Dataset 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;
}
4

2 回答 2

0

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

于 2012-09-26T20:38:43.163 回答
0

如果您获得单个值,则将其放入表中以检索值会很慢。

但是检索一次值。

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 发出删除命令。
如果记录不存在,它将不会删除任何内容。并以 10-100 个为一组进行分组。
会有甜蜜点。
删除 [XYX] where [ABCTable] in (..,..,..);

于 2012-09-26T20:48:01.607 回答