2010-11-15 128 views
0

在我的項目,我需要對登錄我的數據庫執行的所有查詢。作爲一個例子,我們可以在這裏使用員工用戶數據。在I類有一個函數生成與參數的命令如下:參數化查詢作爲字符串

Public Function SQLUpdate(ByVal conn As SqlClient.SqlConnection) As SqlClient.SqlCommand Implements IDbConnected.SQLUpdate 
    Dim sqlstatement As String = "UPDATE Persons SET [email protected], [email protected], [email protected], [email protected], " & _ 
           "[email protected], [email protected],[email protected], [email protected], [email protected], [email protected]" 
    sqlstatement &= " WHERE ID=" & Me.ID 
    Dim comm As New SqlClient.SqlCommand(sqlstatement, conn) 
    With comm.Parameters 
     .Add("@act", SqlDbType.Bit).Value = Me.Active 
     .Add("@abbr", SqlDbType.VarChar).Value = Me.Abbreviation 
     .Add("@first", SqlDbType.VarChar).Value = Me.FirstName 
     .Add("@last", SqlDbType.VarChar).Value = Me.LastName 
     .Add("@bday", SqlDbType.SmallDateTime).Value = Me.Birthday 
     .Add("@email", SqlDbType.VarChar).Value = Me.Email 
     .Add("@tel", SqlDbType.VarChar).Value = Me.Telephone 
     .Add("@fax", SqlDbType.VarChar).Value = Me.Fax 
     .Add("@reg", SqlDbType.Bit).Value = Me.Registered 
     .Add("@adm", SqlDbType.Bit).Value = Me.Administrator 
    End With 
    Return comm 
End Function 

當我請求命令文本

comm.CommandText 

然後我得到仍然是parametrizid查詢

UPDATE人員SET Active = @ act,縮寫= @ abbr,FirstName = @ first,LastName = @ last,Birthday = @ bday,Email = @ email,Tel = @ tel,Fax = @ fax,Registered = @ reg,Admin = @ adm WHERE ID = 2

off course我需要查詢的參數被替換的值。有沒有一個簡單的方法來做到這一點,或者我需要編程一個函數來替代它自己?

回答

7

查詢返回到服務器,參數爲參數(這有助於安全和查詢計劃的重用)。所以你不需要存在什麼 - 因此它不存在。

我個人不會取代他們,登錄即使;登錄時,我只會追加名稱/值對即日誌是這樣的:

UPDATE人員設置活動= @行爲,縮寫= @縮寫,名字= @第一,姓氏= @最後,生日= @ bday,電子郵件= @電子郵件,電話= @電話,傳真= @傳真,註冊= @註冊,管理= @ adm WHERE ID = 2 || @ act = 1 @ abbr = mjg @ first = Fred ...

+0

+1肯定保持參數化。只需添加一下,可以方便地將輸出以SSMP的讀取運行形式輸出 - 因此,我之前剛剛編寫了一個方法,可以將每個參數(正確類型)的DECLARE語句與適當的命令串行化,並且然後在實際的命令文本之前設置這些變量。意思是你可以直接複製n粘貼到日誌文件中直接輸入SSMS – AdaTheDev 2010-11-15 15:17:36

+0

,因爲這個問題純粹是爲了日誌記錄的目的,所以我會考慮將它們附加到字符串中。我想我正在讓事情比他們應該做的更困難。謝謝! – Geoffrey 2010-11-15 15:27:19

1

您正在查找的字符串不存在。 .net運行時或sql服務器從未將您的值直接替換爲查詢文本。它只是不會發生。這是參數化查詢的要點;保持(潛在危險的)數據參數與代碼分離。

如果你想要這個字符串,你必須建立它自己;建立字符串應該說明爲什麼這是錯的行爲:想想代碼中的值替代會是什麼樣子,然後想象一個憤怒的用戶在一個縮寫或名字的價值';DROP TABLE Persons;--。考慮一下你要創建的字符串,以及如果該字符串是由服務器直接執行的話會發生什麼。

如果你真的想記錄的查詢時,實際的命令使用sp_executesql在幕後,但如果它運行一個腳本,更像是這一點,你可以把它想象:

DECLARE @act bit; Set @act = (value from client) 
DECLARE @abbr VARCHAR(10); Set @abbr = (value from client) 
DECLARE @first VARCHAR(30); Set @first = (value from client) 
--... 
UPDATE Persons SET [email protected], [email protected], [email protected] 
+0

我明白參數化查詢的重要性。問題不是爲了執行而獲取這個字符串,而是爲了活動記錄的目的。儘管如此,我還是要感謝你爲什麼參數化從安全角度來說非常重要。 – Geoffrey 2010-11-15 15:24:13

+0

這不僅僅是爲什麼它很重要 - 我還試圖說明爲什麼你要求的東西不存在,並不完全合理。 – 2010-11-15 17:03:19

0

你將不得不編寫你自己的函數來獲得你正在尋找的東西。實際發送給服務器的是參數化查詢和一組參數對象,而SQL Server在那裏完成所有工作。

第二個選擇是在服務器上運行SQL事件探查器查看正在執行存在的命令。

相關問題