新的SQLConnection对象(尽管具有相同的ConnectionString),这将是一种安全的继续方式。我在哪里可以找到这个GetConnection方法?这实际上应该足够了。我总是使用'SqlConnection=newsqlconnection

新的SQLConnection对象(尽管具有相同的ConnectionString),这将是一种安全的继续方式。我在哪里可以找到这个GetConnection方法?这实际上应该足够了。我总是使用'SqlConnection=newsqlconnection,sql,multithreading,sql-server-2008,Sql,Multithreading,Sql Server 2008,新的SQLConnection对象(尽管具有相同的ConnectionString),这将是一种安全的继续方式。我在哪里可以找到这个GetConnection方法?这实际上应该足够了。我总是使用'SqlConnection=newsqlconnection(connectionString);connection.Open();'从未出现过任何混合问题。你能发布一些函数代码和函数的使用吗?好的,我添加了一个示例DA(DataAccess)classIf,如果你遇到MARS问题,我总是有一个问题,


新的SQLConnection对象(尽管具有相同的ConnectionString),这将是一种安全的继续方式。我在哪里可以找到这个GetConnection方法?这实际上应该足够了。我总是使用'SqlConnection=newsqlconnection(connectionString);connection.Open();'从未出现过任何混合问题。你能发布一些函数代码和函数的使用吗?好的,我添加了一个示例DA(DataAccess)classIf,如果你遇到MARS问题,我总是有一个问题,一个执行失败,出现异常,因为已经有一个结果集已经为这个连接打开-我不记得有混淆的问题。我经常遇到这种形式,因为我有输入连接字符串的习惯,有时会丢失MARS子句……我假设IIS在我身上切换某些东西是造成这种情况的原因。但我希望能强迫一些事情,这意味着这并不重要。我现在不使用火星,但听起来很有趣。但它回避了一个问题,WebDevs在MARS之前做了什么?他们做的和你今天应该做的一样-永远不要共享SqlConnection或DataContext。每次使用它时,都会打开一个新的并打开连接。多亏了连接池,这不再是过去的问题了。我运行了一个由IIS线程切换引起的类似问题:是的,我完全可以看到线程之间共享连接是多么糟糕。如其他答案所示,我非常确定我正在为每一批操作创建一个SQLConnection,并且只能从一个主对象中创建,该主对象最多只能持续一个请求的持续时间。这正是我所做的。我创建了一个新的DataContext,并将其存储在Context.Items中——每个请求一个,我从不在多个请求中使用它。除了我有一些奇怪的错误,这些错误只能由多个线程同时访问它来解释。后来的调试显示,IIS确实会转移线程。虽然只要两个移位的线程不同时使用该对象,这仍然不重要,但完全避免基于请求的连接解决了我的问题。我正在DA对象的构造函数中新建一个SQLConnection对象(示例现在编辑到问题中)然后在内部可能需要它的方法上共享它。我确实考虑过了。IIRC我们没有这样做的原因是我们想考虑使用事务的可能性。ie我们需要一个更高的层来决定它想要把几个命令链接到一个事务中。我们将创建一个连接(使其具有事务),然后将其传递给2或3个方法来执行写入。如果在此过程中出现任何失败,回滚将撤消作为事务一部分的每个项目。但是,在创建事务的位置创建连接并传递连接-因为根据我的经验,事务应该尽可能短,并且始终遵循特定的路径,通常在同一级别封装一些函数调用。我还有一个封装DB访问的类,我有一个封装连接的类,在那里你可以指定连接是否有事务。好的,当然,但我还没有这样做。连接是在我的对象的构造函数中创建的。这个对象不能被任何其他线程访问(除非你知道一些我不知道的事情),并且最多只能持续当前WebRequest的生命周期。你的建议听起来非常合理,但我看不出它与我正在做的有什么冲突:(但你不是在重用GlobalConnection()?(我现在没有太多时间深入研究你的代码,我会在几小时后在这里完成…)啊,我看到了混乱。GlobalConnection是一个名称不正确的函数(包含在上面的代码中)。它返回SQLConnection的一个新实例,该实例包装了从配置文件中提取的连接字符串。我想它应该被称为CreateConnectionFromGlobalConnectionString
Imports System.Data.SqlClient
Public Module SomeModule
    Public Function GlobalConnection() As SqlConnection
        Return New SqlConnection(GetSQLStringFromConfig())
    End Function
End Module
Public Class ExampleDA
    Protected Con As SqlConnection
    Public Sub New()
        Me.Con = GlobalConnection()
    End Sub
    Public Function GetRecord(ByVal SQL As String) As String()
        Dim Close As Boolean = EnsureConnectionOpen(Con)
        Dim dc As New SqlCommand(SQL, Con)
        Try
            Dim DcExecuteReader As SqlDataReader
            If Close Then
                DcExecuteReader = dc.ExecuteReader(CommandBehavior.CloseConnection)
            Else
                DcExecuteReader = dc.ExecuteReader()
            End If
            ' ToStringArray doesn't exist but it gets the general point across.
            Return DcExecuteReader.ToStringArray() 
        Catch ex As SqlException
            Throw
        End Try
    End Function

    Public Function GetField(ByVal SQL As String, ByVal DefaultValue As Object) As Object
        Dim Close As Boolean = EnsureConnectionOpen(Con)
        Dim dc As SqlCommand = New SqlCommand(SQL, Con)
        Dim Result As Object = GetField(dc, DefaultValue)
        If Close Then Con.Close()
        Return Result
    End Function

    Private Function GetField(ByVal Command As SqlCommand, Optional ByVal DefaultValue As Object = Nothing) As Object
        Try
            Dim ReturnValue As Object
            Dim Close As Boolean = EnsureConnectionOpen(Command.Connection)
            ReturnValue = Command.ExecuteScalar()
            If ReturnValue Is Nothing Then
                ReturnValue = DefaultValue
            End If
            If Close Then
                Command.Connection.Close()
            End If
            If IsDBNull(ReturnValue) Then
                Return DefaultValue
            Else
                Return ReturnValue
            End If
        Catch ex As Exception
            Debug.WriteLine(ex.ToString)
            Throw
        End Try
    End Function
    Private Function EnsureConnectionOpen(ByRef Con As SqlConnection) As Boolean
        If Con.State <> ConnectionState.Open Then
            Con.Open()
            Return True
        End If
        Return False
    End Function
End Class
GetField( string sqlCommand )
{
   SqlConnection conn = new SqlConnection( connectionString );
   conn.Open();

   try
   {
       using ( SqlCommand cmd = conn.CreateCommand() )
       {
           cmd.CommandText = cmd;

           cmd.ExecuteScalar();


           //here be your code..

       }

   }
   finally
   { conn.Close();
   }
}