0

次のコードを使用してデータベース変数を共有しています。

Namespace DataAccessVariables
    Public Class Vars
        Public Shared s As String
        Public Shared con As String = WebConfigurationManager.ConnectionStrings("Dev").ToString()
        Public Shared c As New SqlConnection(con)
        Public Shared x As New SqlCommand(s, c)
    End Class
End Namespace

次に、これを次のようにプロジェクトにインポートします。

Imports DataAccessVariables.Vars

FXCopでサイトをチェックすると、次のメッセージが表示されます。

Error, Certainty 90, for StaticHolderTypesShouldNotHaveConstructors
{
    Target       : DBVars  (IntrospectionTargetType)
    Resolution   : "Remove the public constructors from 'Vars'."
    Help         : http://msdn2.microsoft.com/library/ms182169(VS.90).aspx  (String)
    Category     : Microsoft.Design  (String)
    CheckId      : CA1053  (String)
    RuleFile     : Design Rules  (String)
    Info         : "Instances of types that define only static members 
                   do not need to be created. Many compilers will automatically 
                   add a public default constructor if no constructor 
                   is specified. To prevent this, adding an empty private 
                   constructor may be required."
    Created      : 2010/04/20 01:25:16 PM  (DateTime)
    LastSeen     : 2010/04/21 07:17:46 AM  (DateTime)
    Status       : Active  (MessageStatus)
    Fix Category : Breaking  (FixCategories)
}

宣言から「PublicShared」を削除すると、変数がページに表示されません。誰かがそれらを共有する正しい方法を教えてもらえますか?

どうもありがとう、フィル。

4

2 に答える 2

5

このエラーは、Public Shared 変数を削除するように指示しているわけではありません。代わりに、メンバーVarsのみが含まれている場合でも、クラスの新しいインスタンスを作成できることを知らせています。Sharedこの問題を解決するには、プライベート コンストラクターを定義します。

Private Sub New()
End Sub

Varsこれにより、クラス自体の外部でクラスのインスタンスを作成するコードが防止されます。

于 2010-04-21T07:42:44.473 に答える
4

それはあなたのクラスで唯一のコードですか?

また、グローバル (静的) を作成しないでくださいSqlConnectionSqlConnectionおよびSqlCommandオブジェクトをオンデマンドで作成するだけです。接続プーリングにより、一度に 1 つの物理データベース接続のみが確立されることが保証されます。

ここで得た方法では、スレッドセーフではありません (たとえば、2 人が同時に要求を行うと、物事は非常に厄介になります)。

于 2010-04-21T07:45:20.067 に答える