如何取消循环中的SQL查询,但是不退出循环

我心依旧 2018-01-10 10:36:06
我这里有一个需求,想要在一个庞大的数据库中查找某个值在哪个具体的位置(哪一个表的哪一个字段)(偷偷的说,数据库是公司的ERP,我无法做任何改动)。

然后,之前的做法是用一个网上公开的 FindValueInDB 的存储过程来进行,但是这个存储过程搜索起来太耗时,以前还能成功搜索到值,全部搜索完大概需要五六个小时。但是现在这阶段总是到一半就断开连接,于是我就加了自动重试,也不行,早上过去一看尼玛重试了几百次。

还有人说这么长时间的查询应该优化SQL语句,建立表索引啥的,可是我没办法动啊。

于是我现在就自己写了一个客户端程序,就查到在哪个表就完了。现在写是写完了,原理就是先读取这个数据库的所有表,然后用循环挨个表执行SQL语句去搜索(具体就不说了)。

但是问题来了,有的表查询会Timeout,一Timeout查询就结束了。于是我就想检测每一个表的查询时间,一旦这个表查询超过20秒(低于Timeout的上限),就结束然后调到下一个表进行。但是现在我不知道怎么实现,我用了 conn.cancle。但是一执行就结束了整个循环。

有大神可以帮忙解决一下的吗?谢谢了!希望你们能看懂我在说什么。
...全文
443 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我这边不分析你的需求是否正确,然后跟你说怎么处理: 我可以想象你的循环查询是这样做的: 定义数据库连接参数等 开始循环 查询 判断超时就取消连接 循环结束语句 问题很明显,你在中间部分取消数据库连接将会导致整个循环中的公有连接失效,取消之后的剩余查询会因为失去连接导致无法继续。 所以方法很简单,在循环中打开数据库连接,查询后断开,如果超时提前断开即可。
正怒月神 2018-01-11
  • 打赏
  • 举报
回复
看起来你不能对数据库操作? 那你开几个线程,同时查询多张表。 试试吧
warcraftmgq 2018-01-11
  • 打赏
  • 举报
回复
每个表的每个字段去遍历找特定值可行,但是这个有点太慢了,还不如先确定你要搜索的值是输入哪个业务或者资料的,去分析ERP库找到相应的表再去检索。
秋的红果实 2018-01-11
  • 打赏
  • 举报
回复
应该可以

SqlConnection con =...............
con.Open();

SqlCommand com;
SqlDataReader dr;
string[] tableName = { "table1", "table2", "table3" }; //用于模拟从数据库读取出的所有表
foreach(string t in tableName)
{
    com = new SqlCommand("select * from "+t+"where Key='theCondition'", con);
    com.CommandTimeout = 20;
    dr = com.ExecuteReader();

    try
    {
        if(dr.Read())
        {
            //finded!
        }
        else
        {
            //do not finded!
        }
    }
    catch
    {
        continue;
    }
    finally
    {
        if(com!=null)
        {
            com.Dispose();
        }
        if(dr!=null)
        {
            dr.Dispose();
        }
    }
}
if(con!=null)
{
    con.Close();
}

---------------------------------------\0
秋的红果实 2018-01-11
  • 打赏
  • 举报
回复
一个表最多可以查询20秒 还有,lz找下数据特征,这个库遍历,效率有点低 ------------------\0
xuzuning 2018-01-11
  • 打赏
  • 举报
回复
既然你都能把存储过程放上去并执行起来了,怎么还说没有权限之类的话 你不能每次都大海捞针,而是要看准鱼群再撒网 先查询出有哪些库,再查询出库中有那些表,表中都有哪些字段,一一记录下来 根据字段名,一般就可确定该查找的范围了
cyg17173 2018-01-11
  • 打赏
  • 举报
回复
这个需求有点扯。 1个ERP 数据库,最少几个G,最多几十个G,这样的需求配上算法是天文数字。 一个100 columns 100 rows的table,就需要1万次计算,还要算上精度、类型,转换的时间。 像SAP 有几万个表,一个表里少则几万行,多则几百万行。 ---------------------------------------------------------------------------------------------------------- 起码先要判定业务范围,框定大致的表范围,再来搜索。否则怎么循环,怎么查询都是白搭。
threenewbee 2018-01-10
  • 打赏
  • 举报
回复
只能放在线程里,然后主线程超时就关掉线程。
圣殿骑士18 2018-01-10
  • 打赏
  • 举报
回复
加try catch捕获timeout异常,然后在catch处判断是否是timeout异常,是就continue下一个表。
张朋举Biz 2018-01-10
  • 打赏
  • 举报
回复
哪一个表的哪一个字段,除了挨个查,好像没什么好办法了;
秋的红果实 2018-01-10
  • 打赏
  • 举报
回复
command加上timeout=20

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧