2010-01-10 5 views
8

Différents serveurs de base de données utilisent différentes méthodes pour citer et échapper des identifiants.Comment citer/échapper des identifiants tels que les noms de colonnes avec JDBC?

E.g. "foo bar" vs "foo bar" vs [foo bar], ou "10" "" vs "10 \" ", ou des identifiants tels que FooBar ou tableau doivent être indiqués pour certaines bases de données mais pas pour d'autres ..

Y a-t-il une méthode API qui exécute correctement les citations/échappements pour une connexion de base de données donnée?

Répondre

3

Je pense que la réponse à votre question est que si vous écrivez une application de base de données neutre en utilisant JDBC, alors vous besoin d'utiliser des noms neutres pour la base de données, et non pas des éléments qui nécessitent un échappement spécial par fournisseur de base de données

Rien de ce que je connais dans le JDBC ne permet de le faire, un produit ORM traitera de telles choses

Éditer: Si vous écrivez un ORM, alors je pense avoir besoin d'une classe de génération SQL séparée pour chaque base de données supportée, juste pour gérer les différentes syntaxes impliquées, donc vous auriez à écrire cela. Vous pouvez certainement regarder le code source des différents ORM open source et voir comment ils le gèrent.

+1

Bon point sur les noms de bases de données neutres, mais des surprises peut toujours apparaître (par exemple, un certain identifiant peut ne pas être acceptable dans une autre base de données). Aussi, que se passe-t-il si j'écris réellement un ORM? Cela nécessiterait-il une implémentation séparée de citation/échappement codée à la main pour chaque base de données prise en charge? – aditsu

+1

Respectez les règles de dénomination des identifiants dans le standard SQL. Ceux-ci fonctionneront n'importe où. –

+1

@PaulTomblin Heh, oui, le "standard". Il y a beaucoup de flexibilité dans la spécification - et les fournisseurs ajoutent leurs propres mots-clés et mots réservés, qui doivent être cités si l'application doit les utiliser. Je suis d'accord qu'essayer de coller à la spécification est l'option la moins douloureuse, mais il * aspire * que JDBC n'expose pas un 'java.sql.Connection.quoteIdentifier (...)' ou un DatabaseMetaData.quoteIdentifier (...) 'méthode et sauvegarde SPI, car cela signifie que vous faites toujours la danse de mots réservés. 'getIdentifierQuoteString' ne fait pas le travail, il n'exprime pas les règles de soumission. –

12

Jetez un oeil à

DatabaseMetaData.getIdentifierQuoteString() 

Je ne l'habitude mais ça sonne bien :-)

getExtraNameCharacters() pourrait aussi être d'une aide

+0

Pas une solution complète, mais certainement utile! – aditsu

Questions connexes