2010-11-15 9 views
0

Dans mon projet, j'ai besoin de consigner toutes les requêtes exécutées sur ma base de données. À titre d'exemple, nous pouvons utiliser les données de l'utilisateur du personnel ici. Dans cette classe, j'ai une fonction de génération de la commande avec les paramètres comme suit:Requête paramétrée en tant que chaîne

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 

Quand je demande le texte de commande

comm.CommandText 

je reçois toujours la requête parametrizid

MISE A JOUR Personnes SET Actif = @ act, Abréviation = @ abbr, Prénom = @ premier, LastName = @ dernier, Anniversaire = @ bday, Email = @ email, Tel = @ tel, Fax = @ fax, Enregistré = @ reg, Admin = @ adm O WH ID = 2

hors cours J'ai besoin de la requête où les paramètres sont remplacés par les valeurs. Y at-il un moyen facile de faire cela ou ai-je besoin de programmer une fonction qui fait les remplacements elle-même?

Répondre

7

La requête descend au serveur avec les paramètres comme paramètres (qui aide la sécurité et la réutilisation du plan de requête). Il n'y a donc pas besoin de ce que vous demandez d'exister - et ce n'est pas le cas.

Personnellement, je ne les remplace pas, même lors de la journalisation; Je voudrais simplement ajouter les paires nom/valeur lors de la connexion il, par exemple connecter quelque chose comme:

MISE À JOUR Personnes SET Active = @ acte, Abréviation = @ abbr, FirstName = @ first, LastName = @ dernier, anniversaire = @ bday, Email = @ email, Tel = @ tel, Fax = @ fax, Enregistré = @ reg, Admin = @ adm WHERE ID = 2 || @ act = 1 @ abbr = mjg @ first = Fred ...

+0

+1 Définitivement maintenu paramétré. Juste pour ajouter, il peut être pratique d'avoir la sortie dans un formulaire read-to-run pour SSMS - donc j'ai précédemment écrit une méthode qui sérialisera la commande de façon appropriée avec des instructions DECLARE pour chaque param (correctement typé), et puis définissez ces variables avant le texte de la commande.Signifie que vous pouvez simplement copier n collez ceci dans un fichier journal directement dans SSMS – AdaTheDev

+0

puisque ce problème est purement à des fins de journalisation Je vais prendre en compte votre proposition pour les ajouter à la chaîne. Je suppose que je rendais les choses plus difficiles qu'elles ne devraient l'être. Merci! – Geoffrey

1

La chaîne que vous cherchez n'existe pas. À aucun moment, le serveur .Net run time ou sql ne remplace vos valeurs directement dans le texte de la requête. Cela n'arrive tout simplement pas. C'est le point entier des requêtes paramétrées; garder les paramètres de données (potentiellement dangereux) séparés du code.

Si vous voulez cette chaîne, vous devrez la construire vous-même; l'acte de construction de la chaîne doit démontrer pourquoi cela est faux: Pensez à ce que le code à substituer dans les valeurs ressemblerait, puis imaginez un utilisateur en colère entre la valeur ';DROP TABLE Persons;-- pour une abréviation ou un prénom. Pensez à la chaîne que vous créeriez et à ce qui se passerait si cette chaîne était exécutée directement par le serveur.

Si vous voulez vraiment connecter la requête, la commande réelle utilise sp_executesql dans les coulisses, mais vous pouvez penser comme si elle exécute un script qui est plus comme ceci:

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

Je comprends l'importance des requêtes paramétrées. La question n'était pas d'obtenir cette chaîne pour l'exécution, mais pour l'enregistrement de l'activité. Néanmoins, je vous remercie pour l'exemple illustrant pourquoi le paramétrage est si important du point de vue de la sécurité. – Geoffrey

+0

Il ne s'agissait pas seulement de savoir pourquoi c'était important - j'essayais aussi d'illustrer pourquoi ce que vous demandez n'existait pas déjà et n'a pas vraiment de sens. –

0

Vous devrez écrivez votre propre fonction pour obtenir ce que vous cherchez. Ce qui est réellement envoyé au serveur est la requête paramétrée avec une collection d'objets de paramètres, et SQL Server fait tout le travail là.

Une deuxième option consisterait à exécuter SQL Profiler sur le serveur pour voir les commandes qui y sont exécutées.

Questions connexes