2013-05-14 8 views
2

나는 액세스를 위해 메모장 응용 프로그램을 만드는 중입니다. 나는 메모장을 수용하기위한 양식과 다양한 기능을위한 몇 개의 버튼을 만들었습니다. 메모장은 tblContents이라는 테이블에 Memo으로 저장됩니다. 이는 텍스트에서 255 자 이내로 제한되어 있기 때문입니다.SQL에 아포스트로피를 추가하는 더 좋은 방법은 무엇입니까? - Access VBA

SO에서 많은 양의 텍스트를 복사하여 아포스트로피 문제를 인식하게되었습니다. 내가 어포 스트로피를 추가 할 때 실행하기 위해 특정 구문 (이 시점에서 기억이 안되는)이 될 필요가있는 SQL 문을 실행하면 테이블에 텍스트를 저장할 때를 알 수 있습니다.

사용자가 입력 한 내용을 정확히 유지하려면 아포스트로피와 모두 같은 SQL을 사용하여 추가 할 수 있습니까? 입력을 반복하고 모든 아포스트로피를 제거하지 않으려합니다.

'Save the memo 
Public Sub SaveMemo() 

    'Examine the memo object 
With Forms!frmNotepad!memo 

    'Set focus to memo in order to get length 
    .SetFocus 

    If Len(.Text) > 0 Then 

     'Save to table 
     Dim memoContents As String 
     memoContents = .Text 

     Dim strSQL As String 
     strSQL = "INSERT INTO tblContents (Contents)" & _ 
       "VALUES ('" & memoContents & "'); " 

     'Set the database and execute the SQL 
     Dim db As Database 
     Set db = CurrentDb 

     db.Execute strSQL, dbFailOnError 

    Else 

     MsgBox ("Nothing to save!") 

    End If 

End With 


End Sub 

답변

3

당신이 (다른 곳과) 주변의 파고 봤는데 찾고 :

다음은 사용자가 입력 된 것을 추가하는 내 코드입니다 샘플 코드의 경우 SQL 인젝션이 발생할 수 있습니다. 아포스트로피 (및 기타 재미있는 비즈니스)를 포함하는 사용자 입력이 놀라 울 때가 있고 때로는 심각한 부작용이있을 수있는 메커니즘입니다.

Access 자체에서 작업하는 경우 Recordset을 사용하여 테이블을 업데이트하면 약간의 문제를 줄일 수 있습니다. 대신 INSERT 문을 실행하면

Dim cdb As DAO.Database, rst As DAO.Recordset 
Set cdb = CurrentDb 
Set rst = cdb.OpenRecordset("tblContents", dbOpenDynaset) 
rst.AddNew 
rst!Contents = memoContents 
rst.Update 
rst.Close 
Set rst = Nothing 
Set cdb = Nothing 

당신이 문자를 이스케이프 또는 SQL 주입에 의해 넘어지고 대해 걱정할 필요가 없습니다 그 방법을 사용할 수 있습니다.

+0

이제 SQL 주입에 대해 자세히 살펴 보겠습니다.하지만 머리 위로는 Santosh 's보다 우월합니다. – Katana24

+0

@ Katana24 Santosh가 권장하는 방법은 대다수의 SQL 삽입 상황에서 사용자를 보호하지만 일반적으로 방탄으로 간주되지 않습니다. 코드 작성자가 의도 한 것 이외의 작업을 수행하기 위해 데이터베이스 엔진을 "속일"수있는 다른 방법이있을 수 있습니다. Recordset 접근법 (그리고 유사한 * Parameterized SQL * 메커니즘)에 대한 좋은 점은 개발자 (개발자)가 다양한 주입 시스템에 대해 "롤링"할 필요가 없다는 것입니다. 사용자가 호출하는 데이터 액세스 방법이이를 처리합니다. –

+0

일부 독서를 한 후에 나는 당신이 당신의 접근 방식에 맞다고 믿습니다. 악의적 인 문자열 문이 테이블에 저장 될 수 있고, 백엔드 서버 (SQL 서버)에 첨부 된 경우 손상된 데이터를 생성하거나 악화시킬 수 있습니다 (테이블 삭제). 그게 네가 염려 할만한가? – Katana24

2

당신은 대체 사용할 수있다() 함수

memoContents = .Text 
memoContents = Replace(memoContents ,"'","''") 
관련 문제