2010-04-15 5 views
4

Je travaille actuellement sur un projet pour une application web qui peut être installée sur plusieurs serveurs avec différentes configurations logicielles. Je veux rendre mon application aussi flexible que possible en permettant à l'utilisateur d'avoir différents serveurs SQL installés. Le problème est que la syntaxe SQL utilisée par deux fournisseurs de serveurs ne correspond pas. Pour un exemple simple, voici la même instruction SELECT pour MS SQL et MySQL:Fournisseur neutre SQL

MS SQL - SELECT TOP 1 * FROM MyTable ORDER BY DateCreated DESC

MySQL - SELECT * FROM MyTable ORDER BY DateCreated DESC LIMIT 1

Existe-t-il un moyen standard de faire abstraction de la création de déclaration pour différents fournisseurs? Des ressources en ligne ou des livres traitant de ce problème? Des conseils ou des remarques intelligentes que je trouverais utiles?

Informations supplémentaires: J'écris mon application we dans ASP ASP sur un serveur Windows.

Merci, Spara

+0

ASP ou ASP.NET? – RedFilter

+0

vanille ASP. Non .NET – Sparafusile

+3

* Pourquoi * écrivez-vous une nouvelle application Web dans un langage de script défunt et totalement obsolète et non supporté? –

Répondre

4

Vous pouvez à la norme ANSI SQL conforme 92. Tous les principaux SGBDR je sais que soutiendra. Cependant, il existe des tonnes de choses que les concepteurs de SGBDR ont ajouté pour améliorer leur propre langage SQL. C'est là que vous êtes dans une embardée.

Vous devrez peut-être vous déconnecter du code en fonction du SGBDR auquel vous vous connectez et générer/choisir l'instruction SQL appropriée à ce point.

Une meilleure option serait de créer un DAL pour chaque SGBDR pris en charge. Implémenter une interface DAL à travers les LAD pour les rendre uniformes. Cela devrait être plus facile que de changer de code. Je suggère que plutôt que d'essayer de plaire à tout le monde, vous devriez écrire votre code de manière à supporter le ou les deux premiers systèmes sur lesquels vous prévoyez de déployer et ajouter le support pour d'autres SGBDR au fur et à mesure des besoins.

+3

La norme SQL 92 comportait plusieurs niveaux et ne respectait que le «niveau d'entrée», ce qui en faisait une valeur limitée. – Andrew

+0

L'utilisation de la syntaxe standard autant que possible est certainement un bon début. Mais il échoue complètement sur l'exemple simple que j'ai donné ci-dessus (TOP vs LIMIT). En ce qui concerne votre branchement et l'ajout de fournisseurs à une date ultérieure - cela semble être un travail fou. Faire une branche pour chaque énoncé, puis revenir en arrière et les mettre à jour plus tard semble fastidieux. Je commence à penser à stocker des déclarations quelque part et à récupérer le bon en cas de besoin ... mais je pense que j'ai lu à ce sujet sur thedailywtf.com à un moment donné. – Sparafusile

+0

@Sparafusile: Réponse éditée pour ajouter DAL et interface. –

2

Je vous suggère d'utiliser un ORM (linq, nhibernate etc) pour faire abstraction du dialecte SQL plutôt que d'essayer d'écrire du plain vanilla SQL.

Edit: Is there an OR/M for Classic ASP?

+0

Les deux sonnent comme de bonnes idées, mais je n'utilise pas .NET donc ni l'un ni l'autre ne fonctionnera. – Sparafusile

0

Vous savez, je parie que vous pourriez obtenir avec sql strictement ansi, il suffit de prendre un peu d'effort et probablement du travail supplémentaire. à savoir

SELECT MAX(*) FROM mytable ORDER BY datecreated DESC; 

Il y aura des solutions de contournement dans ansi parce que vraiment toutes les constructions spécifiques db sont des moyens de raccourcir et de raccourci ou moyens existants d'obtenir ou à la description des données. Une autre option pourrait consister à restreindre l'accès aux diverses bases de données aux procs stockés et aux fonctions définies par l'utilisateur. De cette façon, vous pouvez écrire des scripts pour un tas de dbs dont vous savez qu'ils seront utilisés avec l'exigence que votre script spécifique db soit exécuté avant que l'application ne fonctionne. Juste une idée.

+1

Ce n'est pas une instruction MS SQL valide. Je n'ai pas vérifié MySQL. – Sparafusile

+0

C'était juste à côté de ma tête, mais si vous voulez une réponse à une rangée, il y a plusieurs façons de le faire. Je pense toujours qu'avec un peu de creusage et de travail, vous devriez être en mesure de coder la plupart de tout ce dont vous avez besoin en vanille ansi sql aromatisé. – Sean

Questions connexes