2014-11-04 44 views
0

嗯,我產生的代碼從數據庫中提取的值,並創建XML文件,但我堆在如何修改我的代碼,以避免空單元格列值,我也需要從SELECT列的1列中的VALUES列中選擇數據。你能幫我舉個例子嗎?先謝謝你 。從數據庫以價值和VIA C#創建XML文件

代碼

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注入](http://en.wikipedia.org/wiki/SQL_injection)攻擊是開放的。 – 2014-11-04 08:37:03

+0

@SonerGönül - 雖然我同意這個通用規則,在這個特定的例子中,只有整數,你幾乎不能破解整數類型。 – 2014-11-04 09:16:15

+0

謝謝你們的回覆,但我不知道如何使用它。 – 2014-11-04 09:19:05

回答

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); 
} 

這些查詢得到執行無數次,最多就應該一次(在第二種情況有點棘手,但並非不可能)執行,而事實上他們真的應該是主要查詢的一部分(只要表格設置正確)。

一個更大的headscratcher是這樣的:

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

...因爲這是完全一樣的線在前面的for循環。

一旦你成功地創建一個查詢它會很容易將這些數據轉換成XML。

還應考慮encapsulating code in using statements