2014-02-14 8 views
1

데이터베이스에 쿼리를 보내는 일부 클래스가 있습니다. 쿼리 코드에있을 때 모든 것이 잘 작동했지만, 꽤 크다, 나는 파일과 버퍼 리더를 읽을 넣어하기로 결정하지만, 작동하지 않는, 나는 항상이 얻을 :Java의 txt 파일에서 sql 쿼리를 읽는 방법

java.sql.SQLException의 : ORA-00900 :

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); 
01 : 여기
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\' 

내가 사용하고있는 코드입니다 : 유효하지 않은 SQL 문 여기

내 쿼리입니다

+0

나는 아기 단계를 제안합니다. 많은 분야를 선택하려고 할 때, 하나만 선택하십시오. 문제 해결이 쉬워집니다. –

답변

7

Java 문자열 리터럴에서 큰 따옴표 만 이스케이프해야합니다. 파일에서 SQL 쿼리를 읽는 경우 Java는 파일에서 이스케이프 처리되지 않은 큰 따옴표에 아무런 문제가 없습니다.

파일의 큰 따옴표에있는 모든 이스케이프를 제거하면 정상적으로 작동합니다. 대신, 또한

StringBuilder sb = new StringBuilder(); 
String line; 
while ((line = bufferedReader.readLine()) != null) 
{ 
    sb.append(line); 
} 
query = sb.toString(); 

:

p.first_name   "FirstName", 

또한, 각 시간을 시작하지 마십시오 StringBuilder 당신의 while 루프 전에 있도록 만들고, 당신은 반복 당 두 줄을 읽지 않는 것을 세션 ID 값 (작업 할 것임) 끝에 작은 따옴표를 바꾸려면 ? JDBC 자리 표시자를 사용하고 PreparedStatement을 사용하여 쿼리를 실행하기 전에 세션 ID를 바인딩하십시오. 가능한 SQL 주입 시도를 방지합니다. sessionID이 문자열이면 :

Robert'); DROP TABLE players; -- 
+0

고맙습니다. !!! – mrk2

관련 문제