2012-08-06 2 views
1

인턴쉽 프로젝트 용 저널 프로그램을 만들었으며 MS-Access 데이터베이스를 사용하고 있습니다. 나는 프로그래밍하고있다 VB.net. 이제는 저널을 "업데이트"할 수 있도록하기 위해 노력하고 있습니다. 즉, 저널 날짜를 클릭하면 달력 날짜를 클릭하고 저널에 해당 날짜가 있으면 저널로 가져옵니다. 해당 날짜에 하나가 있으면 해당 날짜의 제목 및 업무 일지 텍스트 항목이 표시됩니다. 저널에 대한 변경 사항 (텍스트 필드 편집)이 업데이트 버튼을 클릭 할 때 데이터베이스에서도 변경되도록하고 싶습니다. 여기에 지금까지 가지고 무엇MS Access 데이터베이스 (vb.net)를 업데이트하는 방법

Private Sub COE_JournalBtn_Click(sender As System.Object, e As System.EventArgs) Handles COE_JournalBtn.Click 

    If DateTimePicker1.Value <> Nothing Then 

     If TitleTxt.Text <> "" Then 

      If JournalTextRtxt.Text <> "" Then 

       myConnection.Open() 

       Dim DatePicked As String = DateTimePicker1.Value 
       Dim cmd As OleDbCommand 
       Dim str As String 

       Try 

        MyJournalTitle = TitleTxt.Text 
        MyJournalText = JournalTextRtxt.Text 

        str = "UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked 

        cmd = New OleDbCommand(str, myConnection) 

        cmd.ExecuteNonQuery() 

        myConnection.Close() 

       Catch ex As Exception 

        MessageBox.Show("There was an error processing your request. Please try again." & vbCrLf & vbCrLf & _ 
            "Original Error:" & vbCrLf & vbCrLf & ex.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 

        myConnection.Close() 

       End Try 

       myConnection.Close() 

      End If 

     End If 

    End If 

End Sub 

지금 자체 내 업데이트 문자열 지금

"UPDATE Journals SET JournalTitle='" & MyJournalTitle & "', JournalText='" & MyJournalText & "' WHERE JournalDate=" & DatePicked 

이다, 무슨 일이 절대적으로 아무것도 아니다. 오류 상자가 나타나지 않습니다. 메시지 상자가 나타나지 않습니다. 프로그램이 멈추지 않습니다. 그리고 데이터베이스는 변경되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 코드 또는 누락 된 부분에 오류가 있습니까? 제발 저를 도우려는 이유는 제가 이것을 실제로 알고 싶기 때문입니다. VB.net의 솔루션을 사방에두고 있었기 때문에 MS Access와 SQL을 사용하고 있다는 것에 대해 저에게 적용되는 것을 찾을 수 없습니다. 사전에

감사합니다, 리처드 Paulicelli

답변

3

에 문제가 없습니다 날짜 문자열 값과 액세스 날짜 구분 기호 문자 (#).

"' WHERE JournalDate=#" & DatePicked & "#" 

또한 지역에 따라 문자 그대로의 날짜를 잘못 해석하지 않도록 yyyy-mm-dd 형식으로 날짜 문자열을 변환 할 수 있습니다.

대신 매개 변수 쿼리를 사용하는 것이 좋습니다. 나는 원래 시도가 실패했을 수도있는 이유를 이해하도록 돕기 위해 노력하고 있습니다.

+0

고맙습니다. 내 문제가 있었던 곳이었습니다. 날짜였습니다. 그리고 그게 어디에 문제가 거짓말을 어디에 내가 중단 점을 넣고 코드와 모든 해시 마크를 발견했지만 내가 분석 문장에 물리적으로 넣어 생각하지 않았을 가치가있는 것으로 생각. 어쨌든, 당신의 도움에 너무 감사드립니다. Btw, 날짜 형식은 실제로 mm-dd-yyyy입니다. 이 외에도 공개 프로젝트가 아닌 내부 프로젝트 일뿐입니다. 그러나 나중에 참고할 수 있도록 그 메모를 보내 주셔서 감사합니다. –

4

SQL 주입 공격 및 인용 문제 즉 그가에 코드를 노출 인용 계속에서 코드를 사용할 수있게됩니다 매개 변수를 사용하여

str = "Journals SET JournalTitle=?, JournalText=? WHERE JournalDate=?" 
cmd = New OleDbCommand(str, myConnection) 
cmd.Parameters.AddWithValue("@jounalTitle", MyJournalTitle) 
cmd.Parameters.AddWithValue("@journalText", MyJournalText) 
cmd.Parameters.AddWithValue("@journalDate", DatePicked) 
cmd.ExecuteNonQuery() 

을 피하기 위해 매개 변수화 쿼리를 사용 타이핑 오류가 발생할 확률이 높습니다. 저널 필드, JournalDate, 날짜/시간 데이터 유형이의를 둘러싸고 경우

"' WHERE JournalDate=" & DatePicked 

: 그리고 당신은 당신은 당신의 UPDATE 문이 부분에 문제가있을 수 있습니다 Sql Injection

+1

Unfortunetly 나는 그것을 시도했지만 오랜 오류가 발생하여 작동하지 못했습니다. 방금 Hansup의 방법을 사용하여 빠른 수정을했지만 나중에 사용할 수 있도록 매개 변수화 된 쿼리를 살펴 보겠습니다. 도와 주셔서 감사합니다. –

+0

@RichardPaulicelli DatePicked를 문자열로 선언했기 때문에 이것이 작동하지 않는다고 생각합니다. 날짜로 남겨두면 매개 변수가 작동하며 모든 종류의 로켈 문제점을 피할 수 있습니다. – Fionnuala

관련 문제