ODBCDataReader 随机挂起?
Posted
技术标签:
【中文标题】ODBCDataReader 随机挂起?【英文标题】:ODBCDataReader hangs randomly? 【发布时间】:2012-01-18 23:09:21 【问题描述】:所以,我需要在 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 += ")";
【问题讨论】:
为什么你有一个 50K 值的 IN?为什么这不在表格中? 因为我是菜鸟!你指的是DataTable吗? 不,我不是。我指的是 Access 中的一个表。将 IN 用于这么多值是不明智的。您需要在表上加入。 我很困惑...数据在表“026_006_886”中,如查询中所示。 你有两组数据,表026_006_686中的数据和IN语句中的数据。 IN 语句中的数据也应该在一个表中。然后可以将这两个表与INNER JOIN
进行匹配以获得所需的结果。
【参考方案1】:
您与数据库的连接和查询的执行对我来说似乎没问题。我怀疑“挂起”即将到来,因为您多次运行查询。关于速度的几个技巧。 B 列和 MergedName 列上应该有索引。重构数据表结构也可以提高速度。您的 MergedNames 真的是随机的吗?如果是这样,您可能会被自己的速度所困扰。正如@Remou 建议的那样,我还将比较将您的 MergedNames 列表上传到表的总运行时间,然后加入该表以获取您的结果,然后在完成时删除您的表。
【讨论】:
如果查询要多次运行,最好删除记录而不是删除表。【参考方案2】:最终使用了数据适配器...速度很慢,但提供了持续的反馈而不是冻结。从来没有真正得到很好的答案,但得到了一些关于执行大型查询的更智能方法的建议。
【讨论】:
你的缓慢可能更多地与低效的查询有关,而不是低效的适配器(或大量记录)。期望 50k 值在不到一分钟的时间内完全返回是完全合理的。在将查询放入代码之前,直接尝试对数据进行查询通常是一个好主意 - 我不确定您将如何执行此操作,但在 SQL 中,可能会使用 SQL Management Studio 来测试查询。跨度>以上是关于ODBCDataReader 随机挂起?的主要内容,如果未能解决你的问题,请参考以下文章
错误:“行/列不存在数据”使用 OdbcDataReader