2017-06-26 1 views
1

Ich versuche, Informationen von einem Excel-Tabellenkalkulation zu einer Tabelle in SQL zu schreiben. Der Code funktioniert gut, aber ich bin über Sonderzeichen Problem gestolpert. Ich habe eine Spalte in meinem Tabellenblatt für Notizen, die dann in die SQL-Tabelle übertragen werden. Ich habe einen Kommentar mit einem Komma gefunden und der Code ist fehlgeschlagen.Excel-Zelle Wert zu SQL einschließlich spezieller Charater

Gibt es eine Möglichkeit, die SQL-Tabelle zu ändern, um damit umzugehen oder den VBA-Code zu ändern?

-Code unten:

stSQL = "INSERT INTO Notes " & _ 
        "(ID, Category, Ref, Client, Notes, Date_Loaded, Latest) " & _ 
        " VALUES (" & _ 
        "1, " & _ 
        "4, " & _ 
        "'" & Sheets("Clients").Range("N" & i).Offset(0, -12).Value & "', " & _ 
        "'" & Sheets("Clients").Range("N" & i).Offset(0, -11).Value & "', " & _ 
        "'" & Sheets("Clients").Range("N" & i).Value & "', " & _ 
        "'" & Date & "', " & _ 
        "1)" 

Vielen Dank im Voraus

+0

Dieses 'Special Character Issue' ist berühmt als' SQL injection'. – Vityata

+1

Abfrageparameter sind Ihre Freunde. Benutze sie. –

Antwort

1

Im Allgemeinen SQL Injection ist etwas, das Sie auch bewusst sein sollten, wenn Sie etwas mit SQL codieren.

Dies war eine große Sicherheit Sache vor 10 Jahren in allen Sprachen. Heutzutage sind fast alle Programmiersprachen automatisch durch diese geschützt.

Sogar VBA.

In der Regel müssen Sie so etwas wie dieses (code DbFormus) schreiben:

Dim cmd   As ADODB.Command 
Dim prm1   As ADODB.Parameter 
Dim prm2   As ADODB.Parameter 
Dim prm3   As ADODB.Parameter 
Dim strSql   As String 

strSql = "UPDATE justtesting SET myTest = ?, myDate = ? WHERE id = ?" 

Set cmd = New ADODB.Command 
With cmd 
    Set .ActiveConnection = CurrentProject.Connection 

    .CommandText = strSql 
    .CommandType = adCmdText 

    Set prm1 = .CreateParameter("mytext", adVarWChar, adParamInput, 35) 
    .Parameters.Append prm1 
    prm1.Value = "as""d''##'fasdf" 

    Set prm2 = .CreateParameter("mytimestamp", adDate, adParamInput) 
    .Parameters.Append prm2 
    prm2.Value = Now 

    Set prm3 = .CreateParameter("mylong", adInteger, adParamInput) 
    .Parameters.Append prm3 
    prm3.Value = 42 

    .Execute , , adExecuteNoRecords 
End With 
Set cmd = Nothing 

Nehmen Sie sich die Fragezeichen im Code einen Blick. Selbst wenn Sie SQL Injection versuchen, weiß ADODB, was zu tun ist, um es zu umgehen und Ihre Daten zu schützen.

Sie können weitere Beispiele darüber finden, wenn Sie es so google: https://www.google.com/search?q=avoid+sql+injection+vba&oq=avoid+sql+injection+vba&aqs=chrome..69i57.3193j0j4&sourceid=chrome&ie=UTF-8

Im allgemeinen SQL die Art und Weise liest du es ist ein riesig Sicherheitsproblem tun. Der einzige Grund, so zu schreiben, ist, wenn Sie die einzige Person sind, die die Anwendung verwendet. Im Allgemeinen kann jeder mit fast keinen Fähigkeiten Ihre Datenbank löschen oder die Werte dort lesen. Oder tu andere schmerzhafte Sachen.

Verwandte Themen