2014-11-04 2 views
0

음 데이터베이스에서 값을 가져 와서 XML 파일을 만드는 코드를 생성하지만 열 VALUEES의 빈 셀을 피하기 위해 코드를 수정하는 방법을 스택으로 작성합니다. 또한 VALUES 열에서 데이터를 선택해야합니다. SELECT 열은 1입니다. 예제를 도와 주시겠습니까? 미리 감사드립니다.데이터베이스에서 값 가져 오기 및 XML 파일 만들기 C#

코드

public DataSet produceFieldsXml(int langID, int presID) 
    { 
     SqlConnection con = new System.Data.SqlClient.SqlConnection(); 
     con.ConnectionString = ConfigurationManager.ConnectionStrings["beta"].ConnectionString; 


     SqlDataAdapter da = new SqlDataAdapter(@"SELECT IsubField.ID,IsubField.SUBJECT_ID as SUBJECTID,IsubField.VALUE AS DSCR,IsubField.FIELD_TYPE_ID, PFTT.VALUE AS TITLE 
                FROM I_SUBJECT_FIELD IsubField, P_FIELD_TYPE_TITLE PFTT 
                WHERE IsubField.PRESENTATION_ID = " + presID + @" 
                 AND IsubField.LANGUAGE_ID = " + langID + @" 
                 AND PFTT.FIELD_TYPE_ID = IsubField.FIELD_TYPE_ID 
                 AND PFTT.LANGUAGE_ID = " + langID + @" 
               ORDER BY IsubField.SUBJECT_ID", con); 

     DataSet ds = new DataSet(); 
     da.Fill(ds, "FieldItem"); 

     ds.Tables[0].Columns.Add("SEQ", typeof(Int64)); 

     DataSet dsNew = new DataSet(); 

     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      SqlDataAdapter daII = new SqlDataAdapter(@"SELECT CATEGORY_ID FROM I_SUBJECT WHERE ID = " + Convert.ToInt32(ds.Tables[0].Rows[i]["SUBJECTID"].ToString().Trim()) + "", con); 
      DataSet dsa = new DataSet(); 
      daII.Fill(dsa, "FieldItem"); 

      dsNew.Merge(dsa); 
     } 

     DataSet dsaa = new DataSet(); 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      SqlDataAdapter daII = new SqlDataAdapter(@"SELECT SEQ FROM P_CATEGORY_FIELD WHERE CATEGORY_ID = " + Convert.ToInt32(dsNew.Tables[0].Rows[i]["CATEGORY_ID"].ToString().Trim()) + " AND FIELD_ID = " + Convert.ToInt32(ds.Tables[0].Rows[i]["FIELD_TYPE_ID"].ToString().Trim()) + "", con); 
      daII.Fill(dsaa, "FieldItem"); 
      ds.Tables[0].Rows[i]["SEQ"] = dsaa.Tables[0].Rows[0]["SEQ"];       
     } 

     for (int i = 0; i > dsaa.Tables[0].Rows.Count; i++) 
     { 
      ds.Tables[0].Rows[i]["SEQ"] = dsaa.Tables[0].Rows[0]["SEQ"];   
     } 

     dsaa.WriteXml(Server.MapPath("~/") + "ZipFiles\\" + "new.xml"); 

     return ds; 
    } 
+4

항상 [매개 변수가있는 쿼리] (http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/)를 사용하십시오. 이러한 종류의 문자열 연결은 [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) 공격에 개방적입니다. –

+0

@ SonerGönül - 일반적인 규칙으로 동의하지만이 예제에서는 정수 만 있고 정수 유형은 거의 해킹 할 수 없습니다. –

+0

답장을 보내 주셔서 감사합니다. 그러나 사용 방법을 모르겠습니다. –

답변

0

내가 당신이라면 나는 그 세 쿼리는 위의 권리 조인 주어진 하나 개의 쿼리 수 있습니다 확신하기 때문에 정말 더 SQL을 배우려고 것입니다. 유감스럽게도 I_SUBJECT_FIELD, P_FIELD_TYPE_TITLE, I_SUBJECT 및 P_CATEGORY_FIELD의 모양과 관련성을 표시하지 않는 한 지금 당장은 도움을 드릴 수 없습니다.

이 단순히 아주 나쁜이기 때문에 :

for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
{ 
    SqlDataAdapter daII = new SqlDataAdapter(@"SELECT CATEGORY_ID FROM I_SUBJECT WHERE ID = " + Convert.ToInt32(ds.Tables[0].Rows[i]["SUBJECTID"].ToString().Trim()) + "", con); 
} 

for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
{ 
    SqlDataAdapter daII = new SqlDataAdapter(@"SELECT SEQ FROM P_CATEGORY_FIELD WHERE CATEGORY_ID = " + Convert.ToInt32(dsNew.Tables[0].Rows[i]["CATEGORY_ID"].ToString().Trim()) + " AND FIELD_ID = " + Convert.ToInt32(ds.Tables[0].Rows[i]["FIELD_TYPE_ID"].ToString().Trim()) + "", con); 
} 

그 쿼리를 여러 번 실행 얻을 대부분에서 그들은 한 번 (비트 두 번째 경우에 까다하지만 불가능하지 않음) 실행해야하며, 사실 그들은 정말 테이블이 올바르게 설정되어 있으면 기본 쿼리의 일부 여야합니다. 그 이전에 대한 루프에서와 같은 줄 정확히 때문에 ...

for (int i = 0; i > dsaa.Tables[0].Rows.Count; i++) 
{ 
    ds.Tables[0].Rows[i]["SEQ"] = dsaa.Tables[0].Rows[0]["SEQ"];   
} 

:

더 큰 headscratcher이있다.

일단 단일 쿼리를 만들면 해당 데이터를 XML로 변환하는 것이 훨씬 쉬울 것입니다.

encapsulating code in using statements도 확인하십시오.