2013-04-30 2 views
0

xml을 구문 분석하여 노드 값을 읽었으며이 값을 ex 유효성 검사를위한 사용자 지정 목록으로 가져옵니다.특수 문자가있는 SQL 쿼리를 H2 데이터베이스에 삽입하는 중 오류가 발생했습니다.

이제 H2Database의 테이블에 값을 삽입하려고 할 때 값에 대해 xml을 구문 분석 한 후 구문 오류가 발생합니다. 난 뒤에 코드에서 테이블을 업데이트 쓴 내가

<DmtTask xsi:type="SqlTask"> 
     <TaskSeverity></TaskSeverity> 
     <TaskCategory></TaskCategory> 
     <TaskTitle></TaskTitle> 
     <TaskMessage></TaskMessage> 
     <TaskCode></TaskCode> 
      <DSqlGenerated></DSqlGenerated> 
     <TaskName>VALIDATE_COMPANIES_MISSING_AVAILABILITY_DATE</TaskName> 
     <SqlQuery>DROP TABLE CLIENT_VALIDATION.COMPANIES_MISSING_AVAILABILITY_DATE IF EXISTS; 
      CREATE TABLE CLIENT_VALIDATION.COMPANIES_MISSING_AVAILABILITY_DATE AS 
      (SELECT * FROM CLIENT.COMPANIES WHERE AVAILABILITY_DATE = ''); 
      </SqlQuery> 
      <ReportError>SELECT 'Missing Availability Date' AS ERROR_DESC, 
      ORGANIZATION_NAME,AVAILABILITY_DATE,COUNTRY,EMAIL_ADDRESS,INSTANT_MESSENGER_ADDRESS,REVERSE_DEBIT_CREDIT,KEEP_DEBIT_CREDIT_AND_REVERSE_SIGN 
      FROM CLIENT_VALIDATION.COMPANIES_MISSING_AVAILABILITY_DATE</ReportError> 
     <MetricSchemaName>DMTSCRIPTS</MetricSchemaName> 
    </DmtTask> 

동적 쿼리를 구문 분석

샘플 XML. TaskEditorText 내가 특수 문자를 교체하려고 구문 오류

DROP TABLE CLIENT_VALIDATION.COMPANIES_INVAL_AVAILABILITY_DATE IF EXISTS; 
     CREATE TABLE CLIENT_VALIDATION.COMPANIES_INVAL_AVAILABILITY_DATE AS 
      (SELECT * 
      FROM CLIENT.COMPANIES 
      WHERE 
       AVAILABILITY_DATE != '' 
      AND 
       AVAILABILITY_DATE NOT LIKE '____-__-__'); 

결과

for (int i = 0; i < taskEditorText.Count; i++) 
         { 
          //string sqlGenerated = "false"; 
          db.ExecuteNonQuery("INSERT INTO " + Schema + ".DMTScriptTasks(DmtScriptId,TaskSeverity,TaskCategory,TaskTitle,TaskMessage,TaskCode,TaskName,Execute,UpdatedUser,UpdatedTime) VALUES('" + id + "','" + taskEditorText[i].TaskSeverity + "','" + taskEditorText[i].TaskCategory + "','" + taskEditorText[i].TaskTitle + "','" + taskEditorText[i].TaskMessage + "','" + taskEditorText[i].TaskCode + "','" + taskEditorText[i].TaskName + "','" + true + "','" + CreatedUser + "','" + CreatedDate + "');"); 
         } 

샘플 값 사용자 지정 컬렉션 목록의 목적, 사용 Regex.Escape 아무것도 나를 위해 일한, 정규 표현을 썼다. xml 내가 구문 분석에 대한 모든 제어 권한이 없습니다. 심지어 나는 H2 데이터베이스를 처음 사용합니다. 따라서 데이터베이스의 열에이 유형의 값을 삽입하는 방법을 알고 있다면 도와 주실 수 있습니다.

여기서 우리가 사용하는 데이터베이스는 H2DataBase (Java 데이터베이스)입니다.

+0

이 솔루션은 PreparedStatement 인터페이스를 사용하여 구현되었습니다. –

답변

0
PreparedStatement prep = reader.Connection.prepareStatement("INSERT INTO " + Schema + ".DMTScriptTasks(DmtScriptId,TaskSeverity,TaskCategory,TaskTitle,TaskMessage,TaskCode,TaskName,Execute,UpdatedUser,UpdatedTime,SqlQuery) VALUES (?,?,?,?,?,?,?,?,?,?,?)"); 
Then loop through the collection 

for (int i = 0; i < taskEditorText.Count; i++) 
         { 
          prep.setString(1, id); 
          prep.setString(2, taskEditorText[i].TaskSeverity); 
          prep.setString(3, taskEditorText[i].TaskCategory); 
          prep.setString(4, taskEditorText[i].TaskTitle); 
          prep.setString(5, taskEditorText[i].TaskMessage); 
          prep.setString(6, taskEditorText[i].TaskCode); 
          prep.setString(7, taskEditorText[i].TaskName); 
          prep.setString(8, "true"); 
          prep.setString(9, CreatedUser); 
          prep.setString(10, CreatedDate); 
          prep.setString(11, taskEditorText[i].SqlQuery); 
          //batch insert 
          prep.addBatch(); 
          reader.Connection.setAutoCommit(false); 
          prep.executeBatch(); 
          reader.Connection.setAutoCommit(true); 

         } 

여기서 taskEditorText는 List이고 값을 삽입하려고하는 데이터베이스는 H2Database입니다.

그런 다음 삽입 쿼리의 일괄 업데이트를 수행했습니다.

관련 문제