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

C# 如何对SQL Server运行多个查询?,c#,sql-server,performance,exception,C#,Sql Server,Performance,Exception,我已经阅读并实现了几个不同版本的Microsofts建议的查询SQL Server数据库的方法。在我阅读的所有内容中,每个查询都由一个using语句包围,例如,在某种方法中DoQuery: List<List<string>> DoQuery(string cStr, string query) { using(SqlConnection c = new SqlConnection(cStr)) { c.Open();

我已经阅读并实现了几个不同版本的Microsofts建议的查询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.
}
List DoQuery(字符串cStr,字符串查询)
{
使用(SqlConnection c=新的SqlConnection(cStr))
{
c、 Open();
使用(SqlCommand cmd=newsqlcommand(queryStr,c))
{
使用(SqlDataReader=cmd.ExecuteReader())
{
while(reader.Read())
{
...
//读取列并放入列表以返回
}
//关闭所有正在使用的块
}
}
}
//返回包含列值列表的行列表。
}
我需要对同一数据库中的不同查询字符串运行此代码数百次。似乎每次创建一个新的连接都是低效的,每次删除都是浪费

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

我也在努力改进这一点,因为我一直有点随意

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

目前我是数据库的唯一用户,我没有在多线程或异步中执行任何操作,只是在查询字符串中循环并在其上运行
DoQuery

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


我被困在效率和阻塞问题上。提前感谢。

事实证明,查询结构很好,查询也很好。问题是我在每个查询上都有一个“order by X desc”,而该列没有索引。这导致全表扫描对行进行排序,即使只返回2。这个表大约有300万行,我认为它可以处理得更好。它超时,连接超时360秒!我为该列编制了索引,不再使用“阻塞”废话,顺便说一句,这是一条可怕的消息,在实际超时时返回。如果我为where子句中出现的每一列编制索引,查询现在可以正常运行

由于连接池的存在,
SqlConnection
不是物理连接。它只是连接池中物理连接的一个句柄,当您获取它时会重置它。重用
SqlConnection
在某些罕见的情况下是有意义的,但通常不应该这样做,因为它会带来线程安全和错误恢复方面的问题。不要担心将
SqlConnections
的范围限制为一个查询,这或多或少就是它的使用方式。打开连接,声明命令,然后执行语句,最后关闭连接。连接本身并不昂贵,因为它无论如何都会被池化,但是重用已经初始化的命令可以极大地提高性能,特别是当您执行的查询被参数化并有助于执行计划重用和优化时。是的,代码示例是
SqlConnection
的预期使用方式。如果这给您带来了问题,那么您应该关注的基本上是代码的任何部分,除了这一部分。例如,
cStr
是否每次都是完全相同的字符串?连接池键位于所使用的确切连接字符串上,因此稍有变化就会导致建立不同的物理连接,这通常不是您想要的。如果您只担心上述代码的效率,那么该代码对我来说很好。但是如果您运行相同的代码1000次,那么您应该更加担心SQL查询本身,因为您需要运行很多次。您应该在表中实现索引,尽量避免使用子查询。您可以使用索引视图。。。如果你在谷歌搜索一次,就会有大量的优化指南可用。I/O异常是一个Windows套接字操作产生一个
WSAEWOULDBLOCK
错误。在与SQL Server通信时,这是不常见的,无论您实际如何进行通信,而这段代码本身并不是问题所在。检查诸如“企业”软件防火墙、缺少更新或其他可能在网络级别造成干扰的情况。如果可能,在另一台机器上尝试相同的代码。您的审阅者对于查询本身的效率可能是对的,也可能是错的,但是如果它们暗示您应该重用
SqlConnection
实例,那么它们就不正确。