2016-11-15 59 views
1

我有在SQL端創建的表和字段。調試器指向cnn.Execute uSQL是問題。我正在嘗試將正在訪問該工作表的用戶和計算機名稱寫入SQL。使用VBA插入到SQL表中

Sub UpdateTable() 

Dim cnn As ADODB.Connection 
Dim uSQL As String 
Dim strText As String 
Dim strDate As Date 
Dim strUsername As String 
Dim strComputerName As String 

strUsername = Environ("username") 
strComputerName = Environ("Computername") 


Set cnn = New Connection 
cnnstr = "Provider=SQLOLEDB; " & _ 
     "Data Source=icl-analive; " & _ 
     "Initial Catalog=DW_ALL;" & _ 
     "User ID=dw_all_readonlyuser;" & _ 
     "Trusted_Connection=Yes;" 

cnn.Open cnnstr 

uSQL = "INSERT INTO Audit (UN,CN) VALUES StrUsername , strComputer" 

Debug.Print uSQL 

cnn.Execute uSQL 
cnn.Close 
Set cnn = Nothing 
Exit Sub 
End Sub 
+0

的日誌記錄SQL用戶名在你的SQL服務器中是「dw_all_readonlyuser」,所以,在這個用戶下你可能沒有在數據庫中插入特權? – cars10m

+1

FWIW我發現相當震撼的是,你命名'UpdateTable'是一個執行'INSERT'的過程,而不是像讀取方法調用所期望的'UPDATE'。 –

+1

在bobby表訪問之前,您應該對這類事情使用參數化查詢。 http://bobby-tables.com這是一個很好的例子。 http://stackoverflow.com/questions/10352211/vba-ado-connection-and-query-parameters –

回答

-1

你uSQL應該是這樣的:

uSQL = "INSERT INTO Audit (UN,CN) VALUES " & StrUsername & "," & strComputer 

編輯: 其實是這樣的:

INSERT INTO Audit (UN,CN) VALUES '" & StrUsername & "','" & strComputer & "'" 

不同的是,我們應該設置字符串引號的SQL 。感謝@Tony Dong的評論。


這個答案是對SQL injection.In爲了防止這種情況,可以考慮使用參數化查詢,如本例中的漏洞代碼一個典型的例子:

VBA, ADO.Connection and query parameters

+1

您必須使用單引號 uSQL =「INSERT INTO審計(UN,CN)VALUES'」&StrUsername&「','」&strComputer&「'」 –

+0

TonyDong,您是對的。 @克里斯 - 託尼的解決方案應該工作。 – Vityata

+0

請不要這樣使用。這需要參數化。當你像這樣建立一個字符串時,它對sql注入是開放的。不要提到,如果用戶名或電腦裏有一個單引號,這會失敗。 –