2

Je regarde à travers un ancien code et j'ai trouvé un morceau que je ne peux pas "sembler comprendre le point de .... Pour autant que je peux dire, c'est juste une insertion simple. mais pourquoi ont-ils fait comme ça? Serait-il acceptable de réécrire dans un insert, ou pourrais-je casser quelque chose?Comprendre ASP classique

s'il vous plaît voir ci-dessous:

Set TextRS = Server.CreateObject("ADODB.RecordSet") 
Set TextRS.ActiveConnection = Conn 
TextRS.Source = "SELECT IDX,TIMESTAMP,CURRENTFLAG,TEXT FROM " & TextTable & " WHERE 1=2 FOR UPDATE" 
TextRS.CursorLocation = 2 
TextRS.CursorType = 3 
TextRS.Open ,,,3 

TextRS.AddNew 
TextRS(0).Value = IDX 
TextRS(1).Value = Timestamp 
TextRS(2).Value = "Y" 
    TextRS(3).AppendChunk TextPiece 
TextRS.Update 

TextRS.Close 
+0

Son unique façon de paramétrer l'instruction d'insertion et d'éviter l'injection SQL. Si vous modifiez cela en une instruction d'insertion, assurez-vous de paramétrer la requête. –

Répondre

5

Cette partie de la source me confondre un peu .... where 1 = 2 ??? Apparemment, cela avait pour but de garantir l'absence de correspondance. Quoi qu'il en soit, ce style de programmation est assez ancien en utilisant la technologie ADO et les gens de DAO à ADO ouvrent souvent un curseur pour parcourir la base de données de cette façon ... il ne suit pas les meilleures pratiques modernes sur la façon de faire les choses , vous pouvez et devez le remplacer par une instruction d'insertion!

Il est possible qu'il ait été écrit pre jet4.0/access 2000, auquel cas il s'agissait d'une tentative de simulation d'une procédure stockée paramétrée. Cependant, si le système est plus moderne que cela, je recommande fortement d'utiliser une procédure stockée car elle présente de nombreux avantages. Plans d'exécution mis en cache, paramètres pour réduire les chances d'injection SQL

En fait, j'avais l'habitude d'écrire du code comme il y a 12 ans: p Principalement parce que je ne savais pas mieux, quelle que soit la technologie utilisée.

+1

Ce code est là pour s'assurer qu'aucun résultat n'est retourné, quand tout le code est pour insérer un enregistrement. –

+0

+1 pour la réponse qui a vraiment repéré d'où vient ce style de codage DB. – AnthonyWJones

+1

-1: Je pense que vous devriez donner du crédit au programmeur d'origine. D'une part, il n'y a pas d'itération en cours, et le '1 = 2' n'est pas inutile; il est utilisé pour récupérer un jeu d'enregistrements vide qui contient la définition de schéma, en fait une bonne astuce. Cela a été fait comme un moyen facile de simuler une requête paramétrée et ainsi éviter l'injection SQL. Vous proposez la réécriture comme un INSERT, mais ne suggérez pas d'utiliser une requête paramétrée, annulant ainsi l'un des avantages les plus importants de la technique utilisée. – RedFilter

1

Je réécrirais cela en utilisant la requête ADO paramétrée. La méthode utilisée a un SELECT inutile, ce qui rend le INSERT plus lent.

Ce code semble un peu obscur, mais tout ce qu'ils font est de créer une instance vide d'une ligne de jeu d'enregistrements afin que les valeurs puissent être définies et le jeu d'enregistrements réenregistré. Ceci est lié à être beaucoup plus lent que de faire un INSERT droit.

1

Je voudrais utiliser une instruction d'insertion. Le code mentionné ci-dessus semble un peu "paresseux" ... comme dans "laissez ADO faire le travail pour moi". Cependant, il n'y a rien de vraiment faux avec cela. La partie where 1=2 était là pour retourner une "table vide" ... euh ... je veux dire un jeu d'enregistrements.

2

Ah, le bon vieux ASP classique;)

Le 1 = 2 oblige le sql à ne jamais retourner un match. C'est fondamentalement une façon de construire la commande (?) Afin que vous puissiez ensuite "commodément" changer les valeurs et ensuite une mise à jour va le stocker.

Je l'ai déjà vu, mais je ne l'ai jamais fait de cette façon moi-même. Comme d'autres l'ont dit, une déclaration INSERT paremetisée simple sera meilleure, IMO.