【发布时间】: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进行匹配以获得所需的结果。
标签: c# ms-access odbc datareader