2017-09-30 85 views
0

我正在爲我的數據庫管理主題做一個項目。我無法弄清楚如何將金額添加到以前添加的金額。目前,我只能更新金額。這是代碼。如果我解釋不好,我很抱歉。VB.net/MS訪問每月捐款系統幫助

我有2種形式。我的第一個表格允許我輸入姓氏並將數據檢索到我的列表視圖。

我的第二種形式可以讓我檢索我在第一個表格中輸入的數據,它將顯示在帶有「Last Name | Amount」選項卡的單獨列表視圖中。

我有兩個文本框。一個用於姓氏設置爲只讀以禁用編輯,另一個用於我想輸入的數量。

進入量之後,讓我們說20,它將更新的列表視圖和我的數據庫爲20

的問題是,當我輸入相同的姓氏一新的總額,比方說30, 30將取代20,但它應該是50,因爲20 + 30 = 50.

我瞭解邏輯,並且我嘗試添加另一個文本框用於添加,但我根本不知道它的代碼。

This is Form 1: Adding of Last Name

This is form 2: Updating of Amount. Last Name set to readonly. No function for textbox3

Imports System.Data.OleDb 

Public Class Form2 
Dim conString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Israel De Leon\Documents\testing.accdb;" 
Dim con As OleDbConnection = New OleDbConnection(conString) 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database2.accdb 
Dim cmd As OleDbCommand 
Dim adapter As OleDbDataAdapter 
Dim dt As DataTable = New DataTable() 


Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    'SET LISTVIEW PROPERTIES 
    ListView1.View = View.Details 
    ListView1.FullRowSelect = True 

    'Construct Columns 
    ListView1.Columns.Add("Last Name", 100) 
    ListView1.Columns.Add("Amount", 100) 
End Sub 

Private Sub UpdateLV(lname As String) 
    'Updates last name and amount entered into the database 
    Dim sql As String = "UPDATE Table1 SET LastName='" + TextBox1.Text + "',Amount='" + TextBox2.Text + "' WHERE LastName='" + lname + "'" 
    cmd = New OleDbCommand(sql, con) 

    'OPEN CON, EXECUTE, UPDATE, CLOSE 
    Try 
     con.Open() 
     adapter = New OleDbDataAdapter(cmd) 

     adapter.UpdateCommand = con.CreateCommand() 
     adapter.UpdateCommand.CommandText = sql 

     If (adapter.UpdateCommand.ExecuteNonQuery() > 0) Then 
      MsgBox("Successfully Updated") 

     End If 

     con.Close() 

     Retrieve() 
     ClearBox() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 

End Sub 

Private Sub Retrieve() 
    ListView1.Items.Clear() 
    'SQL STM 
    Dim sql As String = "SELECT * FROM Table1 " 
    cmd = New OleDbCommand(sql, con) 

    'OPEN CON, RETRIEVE, FILL LISTVIEW 
    Try 
     con.Open() 
     adapter = New OleDbDataAdapter(cmd) 

     adapter.Fill(dt) 

     'LOOP THROUGH DT 
     For Each row In dt.Rows 
      Populate(row(0), row(1)) 'Index of database row 
     Next 

     'CLEAR DATATABLE 
     dt.Rows.Clear() 
     con.Close() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 
End Sub 
Private Sub Populate(lname As String, aamount As String) 
    'ROW ARRAY 
    Dim row As String() = New String() {lname, aamount} 

    Dim item As ListViewItem = New ListViewItem(row) 

    'ADD TO ROWS COLLECTION 
    ListView1.Items.Add(item) 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Retrieve() 
End Sub 
Private Sub ListView1_MouseClick(sender As Object, e As MouseEventArgs) Handles ListView1.MouseClick 
    Dim llname As String = ListView1.SelectedItems(0).SubItems(0).Text 
    Dim amounts As String = ListView1.SelectedItems(0).SubItems(1).Text 

    TextBox1.Text = llname 
    TextBox2.Text = amounts 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Dim amounts As String = ListView1.SelectedItems(0).SubItems(0).Text 
    UpdateLV(amounts) 
End Sub 

Private Sub ClearBox() 
    TextBox1.Text = "" 
    TextBox2.Text = "" 
End Sub 

末級

+0

這是一個順便說一句的原型。不介意設計,我真的需要幫助的功能。謝謝!! –

+0

您真的有一個名爲_Amounts_的字符串類型(訪問中的文本)的數據庫字段嗎? – Steve

+0

@Steve數據類型是數字好先生。 –

回答

1

數學運算不應使用字符串來完成。這是一個真正的基本原則,許多VB.NET程序員都沒有足夠的認識,這要歸功於VB.NET項目設置中的Option Strict Off允許的寬恕。
如果您剛剛在VB.NET中啓動一個新項目,請不要使用此設置,而是儘快將其切換爲開。當您嘗試使用字符串時,這會讓您停下來,因爲它們是數字,並強制您進行適當的轉換並檢查提供的值。

所以,你的代碼更新改寫

Private Sub UpdateLV(lname As String) 

    ' Get the amount as a number (decimal for currency is the best) 
    Dim addAmt As Decimal 
    if Not decimal.TryParse(textbox2.Text, addAmt) Then 
     MessageBox.Show("Insert a valid amount please") 
     return 
    End If 

    ' Sanity check 
    if addAmt <= 0 Then 
     MessageBox.Show("Amount should be > 0") 
     return 
    End If 

    'Updates last name and amount entered into the database 
    Dim sql As String = "UPDATE Table1 SET [email protected] 
           ,[email protected] 
           WHERE [email protected]" 
    cmd = New OleDbCommand(sql, con) 
    Try 
     con.Open() 

     ' Using an adapter here is wrong. You use directly the command 
     cmd.Parameters.Add("@name", OleDbType.VarWChar).Value = textBox1.Text 
     cmd.Parameters.Add("@amt", OleDbType.Decimal).Value = addAmt 
     cmd.Parameters.Add("@oldname", OleDbType.VarWChar).Value = lName 
     If (cmd.ExecuteNonQuery() > 0) Then 
      MsgBox("Successfully Updated") 
     End If 
     con.Close() 
     Retrieve() 
     ClearBox() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     con.Close() 
    End Try 
End Sub 

別的東西的量是不是在你的代碼清晰。在這裏更改姓氏的目的是什麼?最後不要保留全局連接對象。相反,在需要時創建它,然後用Using語句將其銷燬。它會更適合你的內存佔用和數據庫

+0

說實話,你@Steve我是遵循一個YouTube的指南來添加,更新,檢索和刪除,我只是將我學到的東西翻譯成這個原型。我的知識是有限的,我不太明白你的姓氏問題。如果是關於lname As String部分,我一直在問自己爲什麼它在那裏。結論我想到的是,它的存在使我的數據庫中的姓氏行可以使用「WHERE」來調用。我正試圖儘快通過這個子系統,以便下週我們的管理系統防禦。 –

+0

_'如果你剛剛在VB.NET中開始一個新項目,不要使用這個設置,而是儘快將它切換到關閉__ - 你的意思是把它切換到_ ** On ** _? –

+0

@Steve我不得不將MessageBox更改爲MsgBox,並且cmd.parameters.Add(「@ amt」,OleDbType.Decimal)= addAmt給我一個錯誤:Expression是一個值,因此不能作爲賦值的目標「 –