Il giusto metodo di condivisione di variabili del database (asp.net)
-
30-09-2019 - |
Domanda
ho condiviso le variabili di database utilizzando il seguente codice:
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
I quindi importare questo al mio progetto come questo:
Imports DataAccessVariables.Vars
Quando controllo il sito con FxCop, ottengo questo messaggio:
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)
}
Se rimuovo il 'Public Shared' dalle dichiarazioni, poi le variabili non sono prese nelle mie pagine. Qualcuno mi può mostrare il modo corretto di condividere loro?
Grazie mille, Phil.
Soluzione
Questo errore non è che ti dice di rimuovere le variabili pubbliche condivise. Invece è che ti permette di sapere che è possibile creare una nuova istanza della classe Vars
, nonostante includa solo i membri Shared
. Per risolvere il problema, definire un costruttore privato:
Private Sub New()
End Sub
Ciò impedirà qualsiasi codice crea un'istanza della classe esterna Vars
della classe stessa.
Altri suggerimenti
E 'questo il solo codice nella tua classe?
Inoltre, non si deve creare un SqlConnection
(statica) globale. Basta creare il SqlConnection
e gli oggetti SqlCommand
on-demand. Il pool di connessioni farà in modo che solo una connessione fisica del database viene effettuata in un momento.
Il modo in cui ce l'hai qui, non è thread-safe (se due persone facciano richiesta, allo stesso tempo, per esempio, le cose stanno andando per ottenere davvero irregolare).