【问题标题】:C# Using one SqlConnection for multiple queriesC# 使用一个 SqlConnection 进行多个查询
【发布时间】:2018-10-05 06:46:06
【问题描述】:

如何正确使用一个SqlConnection对象进行多个查询?

SqlConnection connection = new SqlConnection(connString);

static void SqlQuery(SqlConnection conn, string cmdString)
{
    using (conn)
    { 
        if (conn.State != ConnectionState.Open)
        {
            conn.Close();
            conn.Open();
        }
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = cmdString;
        cmd.ExecuteNonQuery();
    }
}

第一次调用后函数SqlQuery 抛出System.InvalidOperationException“ConnectionString 属性未初始化”

【问题讨论】:

  • 只要您还没有打开的SqlDataReader 读取前一个查询的查询结果,您就可以重复使用相同的连接。
  • 那么,我是否为下一个查询创建了新连接?

标签: c# sqlconnection .net-4.6


【解决方案1】:

总之不要这样做


创建SqlConnection 类的新实例不会创建到 SQL Server 的新网络连接,而是租用现有连接(或创建新连接)。 .NET 为您处理物理连接池。

当您完成连接后(通过它您可以发送多个查询),只需 Close()Dispose()(或最好使用 using{} 块)。

没有必要也不是好的做法来缓存 SqlConnection 类的实例。

更新

这对你的方法来说是一个更好的模式,你不必担心连接状态

static void SqlQuery(string cmdString)
{
    using (var connection = new SqlConnection(connString))
    using (var cmd = connection.CreateCommand(cmdString, connection))
    { 
        connection.Open();    
        // query        
        cmd.ExecuteNonQuery();
    }
}

【讨论】:

  • @AntoshaShmonoff 停止撒谎:)
  • 反正要打开连接
  • @AntoshaShmonoff 您可以使用一个连接,但永远不应该有一种情况是您需要测试它是否已关闭,它应该始终包含在 using 中,即使在更高级别也是如此。您的代码应该足够简单,以使这种关系显而易见。
  • 当您在 TransactionScope 中并需要调用辅助方法时会怎样...最初,我的辅助方法被隔离并创建了自己的连接并运行查询,但现在当我尝试打开第二个 SqlConnection 说它不支持分布式事务。
【解决方案2】:

这取决于你真正的意思/打算做什么。如果您的意思是批处理一组命令?那么是的,

Hth.

【讨论】:

  • 你的意思是我必须收集所有查询然后执行一次到数据库的连接?
  • @AntoshaShmonoff 是的,也就是所有链接参考中显示的“批处理”。这将是保持(单个)连接打开的唯一正当理由。显然这不会在所有情况下都起作用,所以它取决于你想做什么。
  • 我希望根据之前使用 SCOPE_IDENTITY() 插入的结果进行第二次查询。如果我关闭 SQL 语句之间的连接,我会丢失 SCOPE_IDENTITY 吗?
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多