2016-11-30 95 views
-2

我在我的vb.net應用程序中有一個INSERT語句。沿着路東西...在SQL Server中捕獲帶有附加值的SQL INSERT語句

SQL = " Insert into tableA (Value1, Value2, Value3) Values (Mark1, City2, State3) " 

我試圖做的是傳遞到實際上將插入SQL語句中的函數這一點。我正在嘗試在LOG表中插入此sql語句的副本。

Public Function (InsertSQL as String) As Boolean 
nSql = "INSERT INTO tblSQLLOG (InsertSQL, Date, User) VALUES (" 
nSql += "'" & InsertSQL + "', " 
nSql += "'" & Now() & "', " 
nSql += CStr(userName) + ") " 

cmd = New SqlCommand(nSql, conn) 
End Function 

所以,現在,如果我檢查我的nSQL它看起來像....

Insert into tblSQLLOG (insert sql, date,user) values ('insert Insert into tableA (Value1, Value2, Value3) Values ('Mark1', 'City2', 'State3')','11/30/2016 8:46:41 AM', 'Bobby') 

在此插入語句我gettig值1附近的錯誤 - 我不知道我」做錯了。一切看起來都很好。

+5

您應該使用參數 – Steve

+4

始終使用SQL參數。日誌可以使用'cmd.CommandText' – Plutonix

+0

你是否試圖插入'tableA'和'tblSQLLOG'兩個表? – Viki888

回答

-1

是的,你應該使用參數。那說問題是你在字符串中有單引號。注意InsertSQL的Replace()

Public Function (InsertSQL as String) As Boolean 
nSql = "INSERT INTO tblSQLLOG (InsertSQL, Date, User) VALUES (" 
nSql += "'" & Replace(InsertSQL,"'","''") + "', " 
nSql += "'" & Now() & "', " 
nSql += CStr(userName) + ") " 

cmd = New SqlCommand(nSql, conn) 
End Function 
+4

這可能會導致datetime發生另一個錯誤(客戶端和服務器可能使用不同的文化)。改用參數。 –

+0

@CetinBasoz參數是要走的路。這就是爲什麼我高舉你的答案。我只是在說明導致錯誤的原因。 –

+0

是的,我的意思是提議的一個也容易出錯。只需更換單引號就無濟於事。在字符串中可能會出現雙引號 - 例如:4「螺絲,如果你也使用這個引號,那麼會出現BIGGER SQL注入攻擊。IOW除了使用參數外,我總是會反對其他建議 –

3

你正在做一件大事情錯誤的事情,那就是你沒有使用參數。

Public Function FuncName (InsertSQL as String) As Boolean 
nSql = <sql>INSERT INTO tblSQLLOG 
    (InsertSQL, [Date], [User]) 
    VALUES 
    (@InsertSQL, @Date, @User) 
</sql> 

cmd = New SqlCommand(nSql, conn) 
cmd.Parameters.AddWithValue("@InsertSQL", InsertSQL) 
cmd.Parameters.AddWithValue("@Date", DateTime.Now) 
cmd.Parameters.AddWithValue("@User", CStr(userName)) 

' then what? you would use cmd and return true or false 

End Function 

PS:還要檢查在SQL服務器審計。

+1

'cmd.Parameters.AddWithValue'是「evil」。 ADO.NET將動態創建參數,並且查詢計劃將在每次值更改時編譯 – Fabio

+0

Fabio,不完全相同。參數只會創建一次,然後您可以將值更改爲N次。查詢計劃OTOH依賴於參數和固定的SQL。 –

+0

不同意查詢計劃。對於'AddWithValue(「@ One」,「test」)''將會生成帶有參數'VARCHAR4(4)'的查詢。對於AddWithValue(「@ One」,「testtest」)',將會用參數'VARCHAR(8)'生成查詢。 Sql服務器將編譯兩個不同的查詢計劃 – Fabio