응용 프로그램에서 여러 언어를 사용할 수 있도록 VB NET에서 언어 사전을 작성하려고합니다.VB NET에서 전역 개체를 만드는 방법
이 사전에는 데이터베이스에서 전체 사전을로드하고이를 메모리에 저장하는 init 메소드가 있습니다.
나머지 클래스에서는 참조를 추가했으며 메서드를 공유하기 때문에 새 인스턴스를 만들지 않고 개체를 직접 사용할 수 있습니다.
내 질문은 내가 Language.GetWord 메서드에만 액세스하는 클래스의 나머지 클래스가 My.Settings 클래스와 같은 방식으로 컬렉션의 적절한 레코드를 가져 오도록 사전 콘텐츠를로드해야합니다.
MySettings를 모든 클래스에서 사용하면 값이로드됩니다. 나는 같은 효과를 찾고있다.
이
클래스의 코드입니다 : 응용 프로그램이로드가 순서대로 데이터베이스에 한 번에 액세스 할 때Public Class LanguageProvider
Private Shared CurrentLanguage As Collection
Public Shared ReadOnly Property GetWord(ByVal Label As String)
Get
Try
Return CurrentLanguage.Item(Label)
Catch ex As Exception
Return Label
End Try
End Get
End Property
Public Shared Sub LoadLanguage(ByVal CultureId As Integer)
Dim SQLController As New SqlDataAccessController
SQLController.SQLSentence = "SELECT DNF_CULTURE_LANGUAGE_LABELS.LABEL, DNF_CULTURE_LANGUAGE_LABELS.VALUE FROM DNF_CULTURE_LANGUAGE_LABELS WHERE DNF_CULTURE_LANGUAGE_LABELS.CULTUREID = " & CultureId & " ORDER BY LABEL;"
SQLController.OpenConnection()
Dim dr As SqlClient.SqlDataReader
dr = SQLController.GetData()
CurrentLanguage = New Collection
While dr.Read()
CurrentLanguage.Add(dr.Item("Value"), dr.Item("Label"))
End While
dr.Close()
SQLController.CloseConnection()
End Sub
End Class
기능 LoadLanguage 호출해야합니다.
그 속성 GetWord가 단어가있는 모음에 액세스하고 그 결과를 반환해야합니다. 문제는 인스턴스가 같지 않고 클래스가이를 사용할 때 사전이로드되지 않는다는 것입니다.
감사합니다. 물론
Public Shared ReadOnly Property GetWord(ByVal Label As String)
Get
Try
If CurrentLanguage Is Nothing then
LoadLanguage(theDefaultCultureIdYouWant)
' Now CurrentLanguage is not Nothing any more,
' so LoadLanguage won't be called again
end if
Return CurrentLanguage.Item(Label)
Catch ex As Exception
Return Label
End Try
End Get
End Property
의 라인을 따라
어쨌든 모든 예외를 포착하는 것에 대해 경고하겠습니다. 숨기고 싶지 않은 오류를 숨길 수 있습니다. 'Collection (컬렉션) '이 아닌 사전을 저장하려면'Dictionary (String, String)'을 사용해야합니다. 그런 식으로 레이블이 'ContainsKey' 메쏘드로 존재하는지 검사하고 예외 기반 제어 흐름을 피할 수 있습니다. 또한 실패한 경우에도 SQL 물건을 닫을 수 있도록'Using' 문 (또는 오래된 VB.NET 버전에서'Try-Finally')을 사용해야합니다. –
Anton와 Martinho는 이전 질문 중 일부를 다시 방문하도록 설득하려고 노력하고 있으며, 질문에 대한 답변이 좋으면 대답 옆의 체크 표시를 클릭하여 ** 수락합니다. – MarkJ