Comment lire requête sql à partir d'un txt-fichier en Java
Je suis avoir un peu de classe qui est d'envoyer des requêtes à la base de données. Tout fonctionnait bien, lorsque la requête a été dans le code, mais comme il est assez grand, j'ai décidé de le mettre dans un fichier et de le lire avec tampon lecteur, mais cela ne fonctionne pas, j'ai toujours ceci:
java.sql.SQLException: ORA-00900: invalid instruction SQL
Voici ma requête:
SELECT
p.first_name \"FirstName\",
p.middle_name \"MiddleName\",
p.last_name \"LastName\",
p.birth_name \"BirthName\",
p.mothers_name \"MothersName\",
p.nick_name \"NickName\",
p.username \"Username\",
p.currency_id \"Currency\",
p.preferred_language_id \"PreferredLanguage\",
p.accepts_email \"AcceptsEmail\",
p.birth_date \"BirthDate\",
p.hear_about_us \"HeardAboutUs\",
p.tax_category_id \"TaxCategory\",
p.birth_place \"BirthPlace\",
p.accepts_id_verification \"AcceptsIdentityVerification\",
p.security_prompt \"SecurityPrompt\",
p.gender_id \"Gender\",
p.tracking_campaign_name \"TrackingCampaign\",
p.accepts_sms \"AcceptsSMS\",
p.accepts_promotional_sms \"AcceptsPromotionalSMS\",
p.identification_number \"IdentificationNumber\",
p.id_verified_id \"IdentificationVerified\",
p.security_word \"SecurityWord\",
p.ident_manual_verified_until \"IdentificationManualVerified\",
p.accepts_chat \"AcceptsChat\",
p.frequent_player_level_id \"FrequentPlayerLevel\",
p.preferred_comm_channel \"PreferredCommunicationChannel\",
p.is_reward_abuser \"IsRewardAbuser\",
p.newsletter_id \"Newsletter\",
p.accepts_rewards \"AcceptsRewards\",
ci.postal_code \"PostalCode\",
ci.country_id \"Country\",
ci.region \"Region\",
ci.email \"Email\",
ci.address1 \"Address1\",
ci.address2 \"Address2\",
ci.address3 \"Address3\",
ci.phone1 \"Phone1\",
ci.phone2 \"Phone2\",
ci.city \"City\",
ci.mobile_phone \"MobilePhone\",
ci.address_state_id \"AddressVerified\"
FROM
player p
JOIN contact_info ci ON p.CONTACT_INFO_ID = ci.CONTACT_INFO_ID
JOIN player_session ps ON p.PLAYER_ID = ps.PLAYER_ID
WHERE
ps.external_client_session_id = \'$sessionID\'
Ici c'est le code que j'utilise:
String query = "";
try{
BufferedReader bufferedReader = new BufferedReader(
new FileReader("templates\\sqlQueries\\GetPlayerDetails.txt")
);
while(bufferedReader.readLine()!=null){
query = new StringBuilder().append(query).append(bufferedReader.readLine()).toString();
}
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
query = query.replace("$sessionID", sessionID);
- Je suggère étapes de bébé. Intead de l'essayer pour sélectionner plusieurs champs, essayez de choisir un seul. Que fait troublehooting plus facile.
Vous devez vous connecter pour publier un commentaire.
Vous avez seulement besoin d'échapper à votre guillemets de Java littéraux de chaîne. Si vous êtes à la lecture de la requête SQL à partir d'un fichier, Java aura pas de problème avec les guillemets sans échappement dans le fichier.
Sortir de toutes les fuites sur les guillemets dans votre fichier, et il devrait fonctionner correctement.
Aussi, créez votre
StringBuilder
avant votrewhile
boucle, de sorte que vous ne pas recommencer à chaque fois, et que vous n'avez pas lu deux lignes par itération:En outre, au lieu de remplacer les simples guillemets à la fin de la valeur d'ID de session (qui fonctionne), utiliser un
?
JDBC espace réservé, et l'utilisation d'unPreparedStatement
de lier l'ID de session avant d'exécuter la requête. Qui serait de prévenir une éventuelle tentative d'injection SQL, par exemple, sisessionID
était la chaîne: