VB.net/MS访问每月捐赠系统援助

时间:2017-09-30 07:59:58

标签: vb.net ms-access-2016

我正在为我的数据库管理主题做一个项目。我无法弄清楚如何将金额添加到之前添加的金额。目前,我只能更新金额。这是代码。如果我不能解释清楚,我很抱歉。

我有2个表格。我的第一个表单允许我输入姓氏并将数据检索到列表视图。

我的第二个表单让我检索我在第一个表单中输入的数据,它将显示在单独的列表视图中,其中包含"姓氏|量"标签

我有两个文本框。一个用于姓氏设置为只读以禁用编辑,另一个用于我想要输入的金额。

输入金额后,让我们说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

结束班

1 个答案:

答案 0 :(得分:1)

不应使用字符串进行数学运算。这是一个真正的基本原则,许多VB.NET程序员都没有想到,这要归功于VB.NET项目设置中Option Strict Off允许的宽恕。
如果您刚刚在VB.NET中启动一个新项目,请不要使用此设置,但请尽快将其切换为On。当您尝试使用字符串时,这将使您停止,因为它们是数字并强制您进行适当的转换并检查所提供的值。

所以你的代码更新了重写的数量

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 LastName=@name
                                ,Amount=Amount+@amt
                                 WHERE LastName=@oldname"
    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

您的代码中还有其他一些不清楚的地方。在这里更改LastName的目的是什么?最后不要保留全局连接对象。而是在需要时创建它,然后使用Using语句将其销毁。这对你的内存占用和数据库来说会更好