2017-06-26 26 views
1

我試圖將信息從Excel電子表格寫入SQL中的表格。代碼工作正常,但我偶然發現特殊字符問題。我在電子表格中爲Notes添加了一列,然後將它們傳輸到SQL表中。我用逗號發現了一條評論,代碼失敗了。Excel的單元格值包括特殊字符的SQL

有沒有辦法改變SQL表來處理這個問題或修改VBA代碼?下面

代碼:

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)" 

在此先感謝

+0

這個「特殊字符問題」以SQL注入而聞名。 – Vityata

+1

查詢參數是你的朋友。使用它們。 –

回答

1

一般SQL Injection的東西,你應該清楚地認識到,如果你是編碼與SQL什麼。

這是10年前在所有語言中的一件大事。如今,幾乎所有的編程語言都被它自動保護。

甚至VBA。

一般情況下,你需要寫這樣的事情(code DbFormus):

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 

看看在代碼中的問號。即使你嘗試SQL注入,ADODB也知道該怎麼做,繞過它並保護你的數據。

你可以找到關於它的更多的例子,如果你谷歌這樣的: https://www.google.com/search?q=avoid+sql+injection+vba&oq=avoid+sql+injection+vba&aqs=chrome..69i57.3193j0j4&sourceid=chrome&ie=UTF-8

一般來說,閱讀SQL你正在做的這是一個巨大的安全問題的方式。這樣寫的唯一理由是如果您是唯一使用該應用程序的人。一般來說,幾乎沒有技能的人可以放下數據庫或讀取數據。或者做其他痛苦的事情。