2013-10-27 77 views
0

我有一個問題,我希望你可以幫助一個函數。VB.Net全局數據集公共函數內

我的應用程序是一個簡單的應用程序,它使用Access數據庫加載員工信息,並從Word模板創建信件和財務分類表,然後用戶可以打印並保存回數據庫。

我開始創建一個包含幾個數據表的數據集爲每個表單子例程,但它導致了幾百行重複的代碼。但它的工作。

我想要做的是擁有一個數據集,其中包含有關員工所需的所有信息,並且能夠同時在多個表單中引用它。所以,我創建了一個公用模塊,看起來像這樣:

Public Module Datasets 
Public update As String 
Dim pCn As OleDb.OleDbConnection 

Public Function CSofwareDataSet() As DataSet 
    'open new connection to database 
    pCn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\CGI Project\CorrespondenceSoftware\Database1.accdb; Persist Security Info=False;") 
    Try 
     Call pCn.Open() 'opens the connection 
    Catch ex As Exception 
     MessageBox.Show("Could not open a database connection! 1") 
     MessageBox.Show(ex.ToString) 
    End Try 

    CSofwareDataSet = New DataSet 
Dim daOPG As New OleDb.OleDbDataAdapter("SELECT * FROM Overpayment WHERE PayNumber='" & Main.tbPayNumber.Text & "' AND Gross=1", pCn) 'get all data from Overpayment Details table 
Dim daOPN As New OleDb.OleDbDataAdapter("SELECT * FROM Overpayment WHERE PayNumber='" & Main.tbPayNumber.Text & "' AND Net=1", pCn) 'get all data from Overpayment Details table 
Dim daOPR As New OleDb.OleDbDataAdapter("SELECT * FROM OvpReasons", pCn) 'get overpayment reasons 
Dim daREC As New OleDb.OleDbDataAdapter("SELECT * FROM TaxYear", pCn) 'get recovery date options 
Dim daEMP As New OleDb.OleDbDataAdapter("SELECT * FROM EmployeeDetails WHERE PayNumber='" & Main.tbPayNumber.Text & "' AND Active=1 ", pCn) 'get all data from Employee Details table 
Dim daCON As New OleDb.OleDbDataAdapter("SELECT * FROM Consultant", pCn) 'get all data from Consultant Details table 
Dim daSET As New OleDb.OleDbDataAdapter("SELECT * FROM Settings", pCn) 'get all data from Consultant Details table 
'Find the primary key (if missing) 
    daOPG.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daOPN.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daOPR.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daREC.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daEMP.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daCON.MissingSchemaAction = MissingSchemaAction.AddWithKey 
    daSET.MissingSchemaAction = MissingSchemaAction.AddWithKey 
'setup prefixes 
Dim cbOPG As New OleDb.OleDbCommandBuilder(daOPG) 
    cbOPG.QuotePrefix = "[" 
    cbOPG.QuoteSuffix = "]" 
Dim cbOPN As New OleDb.OleDbCommandBuilder(daOPN) 
    cbOPG.QuotePrefix = "[" 
    cbOPG.QuoteSuffix = "]" 
Dim cbOPR As New OleDb.OleDbCommandBuilder(daOPR) 
    cbOPG.QuotePrefix = "[" 
    cbOPG.QuoteSuffix = "]" 
Dim cbREC As New OleDb.OleDbCommandBuilder(daREC) 
    cbOPG.QuotePrefix = "[" 
    cbOPG.QuoteSuffix = "]" 
Dim cbEMP As New OleDb.OleDbCommandBuilder(daEMP) 
    cbEMP.QuotePrefix = "[" 
    cbEMP.QuoteSuffix = "]" 
Dim cbCON As New OleDb.OleDbCommandBuilder(daCON) 
    cbEMP.QuotePrefix = "[" 
    cbEMP.QuoteSuffix = "]" 
Dim cbSET As New OleDb.OleDbCommandBuilder(daSET) 
    cbEMP.QuotePrefix = "[" 
    cbEMP.QuoteSuffix = "]" 



    If CSofwareDataSet.HasChanges Then 
     Try 
      daEMP.Update(CSofwareDataSet, "EmployeeDetails") 
      daOPG.Update(CSofwareDataSet, "OverPaymentGross") 
      daOPN.Update(CSofwareDataSet, "OverPaymentNet") 
      daSET.Update(CSofwareDataSet, "Settings") 

      MessageBox.Show("Success! Records updated.") 
      update = "0" 
     Catch ex As Exception 
      MessageBox.Show("Oops - something went wrong and it didn't update") 
      update = "0" 
     End Try 
    ElseIf CSofwareDataSet.Tables.Count = 0 Then 
     daOPG.Fill(CSofwareDataSet, "OverPaymentGross") 
     daOPN.Fill(CSofwareDataSet, "OverPaymentNet") 
     daOPR.Fill(CSofwareDataSet, "OverPaymentReasons") 
     daREC.Fill(CSofwareDataSet, "RecoveryDates") 
     daEMP.Fill(CSofwareDataSet, "EmployeeDetails") 
     daCON.Fill(CSofwareDataSet, "ConsultantDetails") 
     daSET.Fill(CSofwareDataSet, "Settings") 

    End If 


    'If update = "1" Then 
    ' Try 
    ' daEMP.Update(CSofwareDataSet, "EmployeeDetails") 
    ' daOPG.Update(CSofwareDataSet, "OverPaymentGross") 
    ' daOPN.Update(CSofwareDataSet, "OverPaymentNet") 
    ' daSET.Update(CSofwareDataSet, "Settings") 
    ' 
    '  MessageBox.Show("Success! Records updated.") 
    '  update = "0" 
    '  Catch ex As Exception 
    ' MessageBox.Show("Oops - something went wrong and it didn't update") 
    ' update = "0" 
    ' End Try 
    ' End If 

    pCn.Close() 

End Function 
End Module 

在每個表單,它就會像這樣引用(作爲一個例子):

Imports WeifenLuo.WinFormsUI.Docking 
Imports Word = Microsoft.Office.Interop.Word 
Imports CorrespondenceSoftware.Datasets 

Public Class GrossInput 

Dim loading = "1" 
Dim NewEmployee = "0" 'sets the default new employee flag to 0 
Private pCn As OleDb.OleDbConnection 

Private Sub GrossInput_Load(ByVal Sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Try 

     Try 
      If CSofwareDataSet.Tables("EmployeeDetails").Rows.Count > 0 Then 
       For i As Integer = 0 To CSofwareDataSet.Tables("EmployeeDetails").Rows.Count - 1 
        cbTitle.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(2) 
        tbFName.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(3) 
        tbLName.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(4) 
        tbAddress1.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(5) 
        tbAddress2.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(6) 
        tbAddress3.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(7) 
        tbAddress4.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(8) 
        tbPostcode.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(9) 
        tbWorkLocation.Text = CSofwareDataSet.Tables("EmployeeDetails").Rows(i)(10) 
        tbWorkLocation.Enabled = False 
        tbPostcode.Enabled = False 
        tbAddress4.Enabled = False 
        tbAddress3.Enabled = False 
        tbAddress2.Enabled = False 
        tbAddress1.Enabled = False 
        tbLName.Enabled = False 
        tbFName.Enabled = False 
        cbTitle.Enabled = False 
        chkMSC.Enabled = False 
        chkOfficer.Enabled = False 
        chkStaff.Enabled = False 
        bnSaveEmp.Enabled = False 
        bnEditEmp.Enabled = True 

       Next 
      End If 
      If CSofwareDataSet.Tables("EmployeeDetails").Rows(0)(11) = "1" Then 
       chkOfficer.Checked = True 
      Else 
       chkOfficer.Checked = False 

      End If 
      If CSofwareDataSet.Tables("EmployeeDetails").Rows(0)(12) = "1" Then 
       chkStaff.Checked = True 
      Else 
       chkStaff.Checked = False 

      End If 
      If CSofwareDataSet.Tables("EmployeeDetails").Rows(0)(13) = "1" Then 
       chkMSC.Checked = True 
      Else 
       chkMSC.Checked = False 

      End If 

     Catch ex As Exception 
      MessageBox.Show(ex.ToString) 
      MessageBox.Show("Employee not found. Ensure pay number is correct and create a new record") 
      NewEmployee = "1" ' tells the program to create a new record if saved 
      cbReference.Enabled = False 
      cbReference.Text = "" 
      bnEditEmp.Enabled = False 
     End Try 

     'display the overpayment references to the user 
     If CSofwareDataSet.Tables("OverPaymentGross").Rows.Count > 0 Then 
      For i As Integer = 0 To CSofwareDataSet.Tables("OverPaymentGross").Rows.Count - 1 
       cbReference.Items.Add(CSofwareDataSet.Tables("OverPaymentGross").Rows(i)(2)) 
      Next 
     End If 
     'display the available consultants to the user 
     If CSofwareDataSet.Tables("ConsultantDetails").Rows.Count > 0 Then 
      For i As Integer = 0 To CSofwareDataSet.Tables("ConsultantDetails").Rows.Count - 1 
       cbConsultant.Items.Add(CSofwareDataSet.Tables("ConsultantDetails").Rows(i)(1) & " " & CSofwareDataSet.Tables("ConsultantDetails").Rows(i)(2)) 
      Next 
     End If 
     'display the available Overpayment reasons to the user 
     If CSofwareDataSet.Tables("OverPaymentReasons").Rows.Count > 0 Then 
      For i As Integer = 0 To CSofwareDataSet.Tables("OverPaymentReasons").Rows.Count - 1 
       cbReason.Items.Add(CSofwareDataSet.Tables("OverPaymentReasons").Rows(i)(1)) 
      Next 
     End If 
     'Load other recovery date options 
     If CSofwareDataSet.Tables("RecoveryDates").Rows.Count > 0 Then 
      For i As Integer = 0 To CSofwareDataSet.Tables("RecoveryDates").Rows.Count - 1 
       cbStartRecovery.Items.Add(CSofwareDataSet.Tables("RecoveryDates").Rows(i)(1)) 
      Next 
     End If 


    Catch ex As Exception 
     MessageBox.Show(ex.ToString) 'Show any errors to the user 
    End Try 
    loading = "0" 
End Sub 

現在!我遇到的問題是,這個工作並沒有任何錯誤地運行,但每次CSSoftwareDataSet函數運行時它都會正確填充表並返回預期的結果,但它會刪除數據表數據,因此每次從該函數引用它需要從頭開始從訪問數據庫中提取所有數據,嚴重影響程序的性能。這些表格不會正確更新,因爲它沒有存儲數據表信息,並且只要插入它的遺忘信息,就不會產生錯誤。我的更新腳本的一個例子是這樣的:

Else 'create a new record 
     'create a new reference 
     Dim REFRowCount = CSofwareDataSet.Tables("OverPaymentGross").Rows.Count + 1 'count the number of rows in table and add 1 
     Dim NewREF = "OVPG" & Main.tbPayNumber.Text & "-" & REFRowCount 
     'Find todays date and reply dates 

     Dim TodayDatedate = Format(Now.Date(), "dd/MM/yyyy") 
     Dim ReplyDatedate = Format(Now.Date.AddDays(21), "dd/MM/yyyy") 

     'Create a new row 
     Dim OPNew As DataRow = CSofwareDataSet.Tables("OverPaymentGross").NewRow() 'create a variable to contain the new row 
     OPNew.Item(1) = Main.tbPayNumber.Text 
     OPNew.Item(2) = NewREF 
     OPNew.Item(3) = tbOverpaymentAmount.Text.ToString 
     OPNew.Item(4) = tbMonRec.Text 
     OPNew.Item(5) = tbTaxP.Text 
     OPNew.Item(6) = TodayDatedate 
     OPNew.Item(7) = ReplyDatedate 
     OPNew.Item(8) = tbMoRep.Text 
     OPNew.Item(9) = cbStartRecovery.Text 
     OPNew.Item(10) = "1" 'Set as gross 
     OPNew.Item(11) = "0" 'do not set as net 
     OPNew.Item(12) = cbReason.Text 
     OPNew.Item(13) = tbAI.Text 
     OPNew.Item(14) = dtpStart.Value.Date 
     OPNew.Item(15) = dtpFinish.Value.Date 
     OPNew.Item(16) = cbConsultant.Text 
     OPNew.Item(17) = tbPosition.Text 

     Call CSofwareDataSet.Tables("OverPaymentGross").Rows.Add(OPNew) 'fill the new row and insert the data 

必須有一個解決方案。創建一個數據集,該數據集在會話中保存其數據,同時打開其他Winforms直到它被重置。我沒有想法,因爲我真的不想回頭重複所有的代碼,實際上我的程序中的每個子程序都是這樣。

我希望我已經解釋好了..任何幫助在這裏將不勝感激。

非常感謝, 巴蒂爾

回答

1

你可以聲明DataSet全球範圍內,在一個函數(子),這是剛剛起步稱爲填充它,並通過訪問變量,而不是通過調用檢索信息功能一遍又一遍。你的代碼使用了某種不明確的方法(函數和變量名稱相同),它們與VB規則(函數可能不包括Return語句,但帶有函數名稱的變量)不起作用。

示例代碼轉換DataSet成一個公共變量和重命名功能(並將其轉換成子:什麼是功能點了吧?):

Public CSofwareDataSet As DataSet 
Public Sub populateDS() 
    'open new connection to database 
    pCn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\CGI Project\CorrespondenceSoftware\Database1.accdb; Persist Security Info=False;") 
    Try 
     Call pCn.Open() 'opens the connection 
    Catch ex As Exception 
     MessageBox.Show("Could not open a database connection! 1") 
     MessageBox.Show(ex.ToString) 
    End Try 

    CSofwareDataSet = New DataSet 

    'Remaining code 

End Sub 

調用此子只有一次(右在每次從數據庫中檢索新數據時),並繼續使用CSofwareDataSet(儘管作爲一個變量,通過刪除Call位;而另一方面,它不是必需的VB.NET)。

+0

太好了!謝謝..已經解決了整個問題。數據集在整個程序中正確保存信息。我應該如何將這些更改發送回數據庫? –

+0

別擔心!我想通了,我創建了一個單獨的數據表,合併它,然後使用新的數據適配器通過通常的更新命令將其發送回數據庫。謝謝!!! –

+0

@ShaneMarsh不客氣。我很高興看到你自己弄清這個最後的問題。 – varocarbas