2

「'SensionVB.CommonCall'の型初期化子が例外をスローしました」という実行時エラーが発生します。オブジェクト呼び出しをインスタンス化しようとすると、次のようになります。

Dim general As New SensionVB.CommonCall

コードの上記の行にヒットして失敗したときにコードをステップスルーすると、実行されます。

Microsoftからの提案は、nullをチェックするか、この場合はどちらも当てはまらない新しいものを追加することです。

SensionVB=プロジェクトCommonCall=さまざまな機能を備えたパブリッククラス

Public Class CommonCall
Protected WithEvents litOne As System.Web.UI.WebControls.Literal
Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString
Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)
Public Shared sMaxSerialNumber As String = "S000001"
Public Shared bLoggedin As Boolean = False
Public Shared iPageWidth As Integer = 1024

Public Shared isValidPassword As Boolean = False
Public Shared strCompanyID As String = ""
Public Shared strSecurityID As String = ""

Dim Response As New HttpResponse(HttpWriter.Null)
Const TimeOutInMinutes As Integer = 60
Const SiteTitle As String = "SensiOn"
Public Const PageWidth As Integer = 1250
Public SSOenabled As Boolean
Const SuperUserEmails As String = "super@domain.com"
Public Sub Initialize()
    oConnection.Open()
End Sub
4

2 に答える 2

3

おそらく原因である可能性のある3つの行が表示されます。


Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString

ここにはいくつかの潜在的な問題があります。1つは、接続文字列名( "SerialStamperConnectionString")が正しくないことです。この名前がweb.configのキーと一致しない場合は、が返さNothingれ、プロパティの値を取得しようとするとNullReferenceExceptionが発生しConnectionStringます。


Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

上記の接続文字列がweb.configで正しく構成されていないためNothing、ConnectionStringとして返される可能性があります。sConnectionがに設定されている場合Nothing、MysqlConnectionコンストラクターでNullReferenceExceptionがスローされる可能性があります。


Dim Response As New HttpResponse(HttpWriter.Null)

もしそうならHttpWriter.NullNothingこれもあなたの問題の原因である可能性があります(上記と同じ理由で)。


これらの提案のいずれも問題を引き起こしていないように思われる場合は、問題に関する詳細情報(スタックトレースを含む)を投稿することをお勧めします。100万のレピュテーションポイントを提供しても、コードに関する追加情報は提供されません。


補遺
共有コンストラクター(および拡張によりメンバー)に関するVBドキュメントによると:

共有コンストラクターが実行される正確なタイミングは、ほとんどが実装に依存しますが、共有コンストラクターが明示的に定義されている場合は、いくつかの保証が提供されます。

  • 共有コンストラクターは、クラスタイプのインスタンスが作成される前に実行されます。
  • 共有コンストラクターは、構造体タイプのインスタンスメンバーにアクセスする前、または構造体タイプのコンストラクターが明示的に呼び出される前に実行されます。構造体用に作成された暗黙のパラメーターなしコンストラクターを呼び出しても、共有コンストラクターは実行されません。
  • 共有コンストラクターは、タイプの共有メンバーのいずれかが参照される前に実行されます。
  • 共有コンストラクターは、型から派生する型がロードされる前に実行されます。
  • 共有コンストラクターは、プログラムの1回の実行中に複数回実行されることはありません。

9.3.2共有コンストラクター

共有フィールドを初期化する共有コンストラクターを作成すると便利な場合があります。

Public Shared sConnection As String
Public Shared oConnection As MySqlClient.MySqlConnection

Shared Sub New()
    Dim l_connectionString = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString")
    If l_connectionString IsNot Nothing Then
        sConnection = l_connectionString.ConnectionString
        oConnection = New MySqlClient.MySqlConnection(sConnection)
    Else
        ' What to do here?
    End If
End Sub

これでは問題が解決しない可能性がありますが、検索と処理が容易になる可能性があります(null文字列など)

于 2012-10-26T02:02:07.290 に答える
1

この行はおそらく失敗します:

Dim Response As New HttpResponse(HttpWriter.Null)

同時に初期化されるため。これを次のように設定してみてください:

Dim Response As HttpResponse = Nothing 

代わりに、初期化するためのコードで初期化します。そこで、nullオブジェクトを取得するかどうかを確認することもできます。

また、共有変数で正しい結果が得られると仮定して、いくつかの初期化を行っています。

Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

これらは共有されるため初期化には影響しませんが、IMOはお勧めできません。

の代わりにInitialize()、使用してみませんかNew()

Public Sub New()
    'TODO move init. of Response to here.
    'TODO move init. of oConnection to here.
    oConnection.Open() 'TODO error check
End Sub
于 2012-10-23T23:56:48.727 に答える