ODBCDataReader随机挂起?

时间:2012-01-18 23:09:22

标签: c# ms-access odbc datareader

所以,我有一个巨大的查询,我需要在Access DB上运行。我试图使用for循环来分解它,因为我无法一次运行查询(它有一个带有50k值的IN)。读者正在引发各种各样的问题。大多数情况下,当我将for循环分解为50-10000的值时,读者将读取400(正好400)值,然后挂起约3分钟然后再做一百左右,挂起,广告。如果我为每个查询执行超过10k的值,它将达到2696然后挂起,在挂起,打开和打开后再执行1k左右。我从来没有真正使用odbc,sql或任何类型的数据库,所以它一定是愚蠢的,或者这是预期的?也许有更好的方法来做这样的事情?这是我的循环代码:

//connect to mdb
OdbcConnection mdbConn = new OdbcConnection();
mdbConn.ConnectionString = @"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\PINAL_IMAGES.mdb;";
mdbConn.Open();

OdbcCommand mdbCmd = mdbConn.CreateCommand();
mdbCmd.CommandText = @"SELECT RAW_NAME,B FROM 026_006_886 WHERE (B='CM1' OR B='CM2') AND MERGEDNAME IN" + imageChunk;
OdbcDataReader mdbReader = mdbCmd.ExecuteReader();

while (mdbReader.Read())
{
  sw.WriteLine(@"for /R %%j in (" + mdbReader[0] + @") do move %%~nj.tif .\" + mdbReader[1] + @"\done");
  linesRead++;
  Console.WriteLine(linesRead);
}
mdbConn.Close();

以下是使用StreamReader从文本文件中读取5000行和值行来填充IN的imageChunk变量的方法:

                string imageChunk = "(";
                for (int j = 0; j < 5000; j++)
                {
                    string image;
                    if ((image = sr.ReadLine()) != null)
                    {
                        imageChunk += @"'" + sr.ReadLine() + @"',";
                    }
                    else
                    {
                        break;
                    }
                }
                imageChunk = imageChunk.Substring(0, imageChunk.Length - 1);
                imageChunk += ")";

2 个答案:

答案 0 :(得分:0)

您与数据库的连接和查询的执行对我来说似乎没问题。我怀疑“挂起”即将到来,因为您多次运行查询。一些速度提示。列B和MergedName应该有索引。重新分解数据表结构也可以提高速度。你MergedNames真的是随机的吗?如果是这样,你可能会坚持你的速度。正如@Remou建议的那样,我还要将上传MergedNames列表的总运行时间与表格进行比较,然后加入表格以获得结果,然后在完成时删除您的表格。

答案 1 :(得分:0)

使用数据适配器结束......速度慢但提供持续反馈而不是冻结。从来没有真正得到一个好的答案为什么,但得到一些建议,以更聪明的方式来执行大型查询。