2016-03-06 70 views
0

我目前正在構建一個程序,需要大量的員工才能使用我的程序,並且程序位於網絡上的共享驅動器上,以便所有用戶都可以訪問該程序。在我的程序中,我有一個數據庫,用於管理所有用戶帳戶和其他信息。當您在網絡上首次運行該程序時,它會要求管理員在哪裏創建數據庫。程序創建數據庫後,我將連接字符串保存到我的程序中的類模塊中的字符串變量。但是,一旦我退出程序,我設置類中字符串變量的值被清除。有沒有辦法在關閉程序後防止字符串丟失值?我知道我可以通過my.settings做到這一點,但我不想這樣做。VB.NET如何保存課程模塊中的程序設置

+1

如果只有一個值要保存,很難理解爲什麼你不想使用設置。否則基本上重新創建輪子:將其保存到本地文件中。 – Plutonix

+0

否關閉程序時無法停止字符串丟失,因爲在關閉程序時該字符串不存在。如果你希望在會話之間保持一個值,那麼唯一的辦法就是把它寫在外部的地方。這正是'My.Settings'所做的。如果你不想使用'My.Settings',那麼你必須自己做。當您再次啓動應用程序時,您必須從文件中重新讀取數據。這正是'My.Settings'所做的。 – jmcilhinney

+2

@Plutonix,我能想到的一個正當理由是,'My.Settings'使用每個用戶的值進行讀寫設置,並修改只讀的每應用程序設置,您必須是管理員用戶。 – jmcilhinney

回答

0

您可以使用二進制序列化器製作您自己的設置文件。

此方法可用於將設置類的實例存儲到文件中,該文件不易讀取。如果需要可讀性和可編輯性,則可以使用xml序列化器。設置文件將駐留在應用程序目錄中。你可以用變量settingsFileName來控制它。

創建一個新的控制檯應用程序並粘貼下面的代碼。運行它幾次,並注意「連接字符串」通過應用程序關閉和打開持久。

Imports System.IO 
Imports System.Runtime.Serialization.Formatters.Binary 

Module Module1 

    Private settingsFileName As String = "Settings.bin" 
    Private mySettingsClass As SettingsClass 

    Private Sub loadSettings() 
     Dim formatter As New BinaryFormatter() 
     If File.Exists(settingsFileName) Then 
      Using stream As New FileStream(settingsFileName, FileMode.Open) 
       mySettingsClass = CType(formatter.Deserialize(stream), SettingsClass) 
      End Using 
     Else 
      Using Stream As New FileStream(settingsFileName, FileMode.CreateNew) 
       mySettingsClass = New SettingsClass() 
       formatter.Serialize(Stream, mySettingsClass) 
      End Using 
     End If 
    End Sub 

    Private Sub saveSettings() 
     Dim formatter As New BinaryFormatter() 
     If File.Exists(settingsFileName) Then 
      Using stream As New FileStream(settingsFileName, FileMode.Truncate) 
       formatter.Serialize(stream, mySettingsClass) 
      End Using 
     Else 
      Using stream As New FileStream(settingsFileName, FileMode.CreateNew) 
       formatter.Serialize(stream, mySettingsClass) 
      End Using 
     End If 
    End Sub 

    <Serializable> 
    Public Class SettingsClass 
     Public Property ConnectionString As String = "" 
    End Class 

    Sub Main() 
     Console.WriteLine("Loading settings...") 
     loadSettings() 
     Dim connectionString = mySettingsClass.ConnectionString 
     Console.WriteLine("Connection string: ""{0}""", connectionString) 
     Console.WriteLine("Enter new connection string...") 
     mySettingsClass.ConnectionString = Console.ReadLine() 
     Console.WriteLine("Saving settings...") 
     saveSettings() 
     Console.WriteLine("Done!") 
     Console.ReadLine() 
    End Sub 

End Module 

SettingsClass可以在其他地方應用程序中使用添加附加屬性。

+0

有一個很好的理由不會爲持久性對象使用BinarySerializer - 它將版本更改爲版本。 –

+0

是的,也許我應該刪除我的答案的最後一行。但是,如果設置類總是隻有一個字符串屬性,它應該沒問題。 – djv

+0

除BinaryFormatter以外,還有其他不是BinaryFormatter的二進制串行器,它們不是特定於版本的。 Eitehr雖然是一個設置矯枉過正。 – Plutonix