我在我的一个应用程序中使用 C# 的 MySql.Data.MySqlClient。
在某个时刻,我的 .net 应用程序从一个大型 MySql 表中选择:
- 有两列,
- 一列为主键(PRI、int(11)、自动递增)
- 其他列是包含一些文本的列,( varchar(8000) )
- 此列的一个示例条目是:
info1=a;info2=b;cIndex=1;info4=d;info5=0.33;
碰巧的是,这个非常大的表中包含文本段“'%cIndex=1;%'”的条目位于包含较大 cIndex 值(例如 34)的文本段的条目之前。
例如:
- column2 值为的条目 “信息1=a;信息2=b;cIndex=1;信息4=d;信息5=0.33”;是第 45566 个条目 在此数据库上,
- 而column2值为 “信息1=a;信息2=b;cIndex=34;信息4=d;信息5=0.33;”是第 10,000,000 个 条目放在 table 上。
- 所以基本上,cIndex 值较低的条目位于 from 之前 cIndex 值较高的条目。
该表与我之前的应用程序的主要区别在于,按照我的标准,我正在运行 sql 语句的表“非常大”;
- 有 2 列
- 还有 2460 万行。
- 以及我上面提到的数据结构。
我在应用程序中运行的 sql 语句的示例是:
SELECT column2 FROM myLargeTable WHERE (column2 LIKE
'%info3=1;%') AND (column2 LIKE '%cIndex=0;%');
并且,我在 C# 应用程序中使用的方法来运行此查询以获得结果基本上如下:
public static string getInfoFromDb(string tbl, string col, string whr)
{
string myInfo = "error";
string sqlStr = "SELECT " + col + " from " + tbl + " " + whr + " " + " LIMIT 1 ";
MySqlConnection cn = new MySqlConnection(cstr);
cn.Open();
try
{
MySqlCommand co = new MySqlCommand(sqlStr, cn);
MySqlDataReader rd = co.ExecuteReader();
while (rd.Read()) { myInfo = rd.GetString(col); }
co.Dispose();
}
catch { /* do nothing */}
cn.Close();
return myInfo;
}
(所以,代码非常简单,并且在我的数据库中工作了很长时间,其中表的大小要小得多,大约有 70000 多行)
我的问题是:
- 我的 sql 语句从以下位置运行时返回正确的结果 Toad-for-MySql 的编辑器页面,对于任何 cIndex 值 - 要么是 较小的值(例如 1)或较大的值(例如 34)。在任何情况下, sql语句返回正确的结果。
而且,正如预期,当 cIndex 值很小(例如 1)时,当这次从我的 C# 应用程序中运行相同的 sql 语句时,此 sql 语句将返回正确的结果,即 SELECT column2 FROM myLargeTable WHERE ( column2 LIKE '%info3=1;%') AND (column2 LIKE '%cIndex=1;%') 返回正确的结果。
但是,有趣的是,这一次出乎意料的是,当从我的 C# 应用程序中运行相同的 sql 语句时,当 sql 语句中感兴趣的 cIndex 值为更大,例如 34。即 SELECT column2 FROM myLargeTable WHERE (column2 LIKE '%info3=1;%') AND (column2 LIKE '%cIndex=34;%')
非常感谢任何帮助。
预先感谢您的时间和考虑。
最佳答案
我发现该错误是由于较大表的超时造成的。
所以,显然,将这行代码添加到我的方法中解决了问题:
co.CommandTimeout = 600; // keep this value relatively large while working with large databases
关于c# - C# 的 MySql.Data.MySqlClient,大型 MySql 表的时间到期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911325/