2017-09-30 8 views
0

데이터베이스 관리 주제에 대한 프로젝트를하고 있습니다. 이전에 추가 된 금액에 금액을 추가하는 방법을 알 수 없습니다. 현재는 금액 만 업데이트 할 수 있습니다. 여기에 코드가 있습니다. 나는 그것을 잘 설명 할 수 없다면 미안하다.VB.net/MS 월별 기부 시스템 지원

2 가지 형식이 있습니다. 첫 번째 양식을 통해 성을 입력하고 목록보기로 데이터를 검색 할 수 있습니다.

두 번째 양식을 사용하면 첫 번째 양식에 입력 한 데이터를 검색 할 수 있으며 "성 | 금액"탭이있는 별도의 목록보기에 나타납니다.

두 개의 텍스트 상자가 있습니다. 하나는 성을 편집하기 위해 읽기 전용으로 설정하고 다른 하나는 입력하려는 값으로 설정합니다.

금액을 입력 한 후,이 문제는 내가 같은 성을위한 새로운 금액을 입력 할 때,의 (30)의 말을 할 수 있다는 점이다 (20)

로 목록보기에 업데이트하고 내 데이터베이스 것의 20을 가정 해 봅시다 30은 20을 대체하지만 20 + 30 = 50이기 때문에 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에서 새 프로젝트를 시작했다면이 설정을 사용하지 말고 최대한 빨리 전환하십시오'_ - ** ** ** **로 전환 하시겠습니까? –

+0

@Steve MessageBox를 MsgBox로 변경해야하고 cmd.parameters.Add ("@ amt", OleDbType.Decimal) = addAmt가 오류를 표시합니다.식이 값이므로 할당 대상이 될 수 없습니다. " –