如何针对SQL Server运行多个查询?

时间:2018-08-16 15:37:00

标签: c# sql-server performance exception

我已阅读并实现了Microsoft建议的几种不同版本的查询SQL Server数据库的方法。在我阅读的所有内容中,每个查询都被using语句包围,例如使用某种方法DoQuery

List<List<string>> DoQuery(string cStr, string query)  
{
    using(SqlConnection c = new SqlConnection(cStr)) 
    {
        c.Open();

        using(SqlCommand cmd = new SqlCommand(queryStr, c)) 
        {
            using(SqlDataReader reader = cmd.ExecuteReader()) 
            {
                while (reader.Read() ) 
                {
                     ...
                     //read columns and put into list to return
                }

           // close all of the using blocks
           }
        }
    }

    // return the list of rows containing the list of column values.
}

我需要针对同一数据库的不同查询字符串运行此代码数百次。似乎每次创建一个新连接都是低效的,而每次浪费都将其丢弃。

我应该如何构造它以便使其高效?当我尝试不使用using块并将连接传递到DoQuery方法时,我收到有关该连接的消息尚未关闭。如果我在查询后关闭它,那么我会收到有关它未打开的消息。

我也在尝试改善这一点,因为我会变得越来越随意

  

IOException:无法从传输连接读取数据:在非阻塞套接字上的操作将阻塞。

我目前是数据库的唯一用户,并且我没有在多个线程或异步状态下执行任何操作。只需循环查询字符串并在它们上运行DoQuery

我的结构是否可能是该问题的一部分,即没有足够快地释放资源,从而导致连接阻塞?

我在效率和阻塞问题上陷入困境。预先感谢。

1 个答案:

答案 0 :(得分:0)

事实证明,查询结构很好,查询也很好。问题是我在每个查询中都有一个“按X desc排序”,并且该列未编制索引。这导致全表扫描对行进行排序,即使仅返回2也是如此。该表大约有300万行,我认为它比它可以处理得更好。 360秒连接超时!我为该列编制了索引,没有更多的“阻止”废话了,顺便说一句,这实际上是超时时返回的可怕消息。现在,如果我为where子句中出现的每一列建立索引,则查询运行良好。