参数化查询为String

时间:2010-11-15 15:07:32

标签: .net sql vb.net

在我的项目中,我需要记录针对我的数据库执行的所有查询。作为示例,我们可以在此处使用人员用户数据。在该类中,我有一个函数生成带有如下参数的命令:

Public Function SQLUpdate(ByVal conn As SqlClient.SqlConnection) As SqlClient.SqlCommand Implements IDbConnected.SQLUpdate
    Dim sqlstatement As String = "UPDATE Persons SET Active=@act, Abbreviation=@abbr, FirstName=@first, LastName=@last, " & _
                                 "Birthday=@bday, Email=@email,Tel=@tel, Fax=@fax, Registered=@reg, Admin=@adm"
    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

然后我仍然得到参数化查询

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

当然我需要查询,其中参数被值替换。有没有一种简单的方法可以做到这一点,还是我需要编写一个自己进行替换的函数?

3 个答案:

答案 0 :(得分:7)

查询下载到服务器,参数为参数(这有助于重用安全性和查询计划)。因此,不需要你要求的存在 - 因此它不存在。

就个人而言,不会替换它们,即使在记录时也是如此;我只需在记录时附加名称/值对,即记录如下内容:

  

UPDATE Persons SET Active = @ act,Abbreviation = @ abbr,FirstName = @ first,LastName = @ last,Birthday = @ bday,Email = @ email,Tel = @ tel,Fax = @ fax,Registered = @reg ,Admin = @ adm WHERE ID = 2 || @ act = 1 @ abbr = mjg @ first = Fred ...

答案 1 :(得分:1)

您要查找的字符串不存在。在任何时候,.Net运行时或sql server都不会将您的值直接替换为查询文本。它不会发生。这是参数化查询的重点;将(潜在危险的)数据参数与代码分开。

如果你想要这个字符串,你必须自己构建它;构建字符串的行为应该说明为什么这是错误的:想想在值中替换的代码是什么样的,然后想象一个愤怒的用户为缩写或名字输入值';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 Active=@act, Abbreviation=@abbr, FirstName=@first

答案 2 :(得分:0)

您必须编写自己的功能才能获得所需内容。实际发送到服务器的是带有参数对象集合的参数化查询,SQL Server在那里完成所有工作。

第二个选项是在服务器上运行SQL事件探查器以查看正在那里执行的命令。