2016-11-10 30 views
0

我想將我的請求的結果存儲在字符串列表(List)中,我想將它存儲在字典(Dictionary)中,但不管請求我使用,我有這個錯誤消息:「位置0沒有行」。C# - 位置0沒有行

public Dictionary<string, object> getPICv2(string Tdate_d, string Ddl_fampic, string Ddl_donnee, string Ddl_detail, string Ddl_caracteristique, string Ddl_poste, string Ddl_ilot, string Ddl_nposte, string Ddl_atelier, string Ddl_tposte) 
    { 
     Dictionary<string, object> list = new Dictionary<string, object>(); 

     SqlDataAdapter dac, dad, dam; 
     DataSet dsm = new DataSet(); 
     DataSet dsp = new DataSet(); 
     DataSet dsd = new DataSet(); 
     DataSet dsc = new DataSet(); 
     DataSet dsb = new DataSet(); 
     DataTable dtm = new DataTable(); 
     DataTable dtc = new DataTable(); 
     DataTable dtv = new DataTable(); 
     DataTable dts = new DataTable(); 
     DataTable dtp2 = new DataTable(); 
     DataTable dtp3 = new DataTable(); 


     SqlConnection cn, cn1; 
     SqlCommand cmd1; 
     string sql = "", test = ""; 

     cn = new SqlConnection(CS_PMI); 
     cn.Open(); 

     cn1 = new SqlConnection(CS_DW); 
     cn1.Open(); 
     sql = ""; 


     // entête 

     // lecture des mois sur la période 

     sql = "SELECT year(CAKJDATE),convert(varchar,DateName(month , DateAdd(month , month(CAKJDATE) , -1))),'01/'+substring(CAKJDATE,5,2)+'/'+substring(CAKJDATE,1,4),COUNT(*) "; 
     sql = sql + "FROM [PMI].[dbo].[CALEND] "; 
     sql = sql + "where CAKTSOC='100' and CAKTTYPE='01' and CAKTCODE='' and CACTACTIF='O' "; 
     sql = sql + "and cast(CAKJDATE as datetime)>=convert(varchar,'" + Tdate_d + "',103) and cast(CAKJDATE as datetime)< convert(varchar,cast('" + Tdate_d + "' as datetime)+390,103) "; 
     sql = sql + "group by convert(varchar,DateName(month , DateAdd(month , month([CAKJDATE]) , -1))),month([CAKJDATE]),year([CAKJDATE]),'01/'+substring(CAKJDATE,5,2)+'/'+substring(CAKJDATE,1,4) "; 
     sql = sql + "order by year([CAKJDATE]),month([CAKJDATE]); "; 


     try 
     { 
      dam = new SqlDataAdapter(sql, cn); 
      dsm = new DataSet(); 
      dam.Fill(dsm, "lstmois"); 
      dtm = dsm.Tables["lstmois"]; 

      //Lblerreur.Text = dtm.Rows[1][2].ToString(); 
     } 
     catch (SqlException e) 
     { 

      cn.Close(); 
      cn1.Close(); 
     } 

     // construction ligne entete du tableau 
     sql = "(SELECT 'Périodes' as entite,'" + dtm.Rows[0][0].ToString() + "<br>" + dtm.Rows[0][1].ToString() + "' as M01,'" + dtm.Rows[1][0].ToString() + "<br>" + dtm.Rows[1][1].ToString() + "' as M02,'" + dtm.Rows[2][0].ToString() + "<br>" + dtm.Rows[2][1].ToString() + "' as M03,'" + dtm.Rows[3][0].ToString() + "<br>" + dtm.Rows[3][1].ToString() + "' as M04,'" + dtm.Rows[4][0].ToString() + "<br>" + dtm.Rows[4][1].ToString() + "' as M05,'" + dtm.Rows[5][0].ToString() + "<br>" + dtm.Rows[5][1].ToString() + "' as M06,'" + dtm.Rows[6][0].ToString() + "<br>" + dtm.Rows[6][1].ToString() + "' as M07,'" + dtm.Rows[7][0].ToString() + "<br>" + dtm.Rows[7][1].ToString() + "' as M08,'" + dtm.Rows[8][0].ToString() + "<br>" + dtm.Rows[8][1].ToString() + "' as M09,'" + dtm.Rows[9][0].ToString() + "<br>" + dtm.Rows[9][1].ToString() + "' as M10,'" + dtm.Rows[10][0].ToString() + "<br>" + dtm.Rows[10][1].ToString() + "' as M11,'" + dtm.Rows[11][0].ToString() + "<br>" + dtm.Rows[11][1].ToString() + "' as M12,'Total' as TT) "; 

     try 
     { 
      dad = new SqlDataAdapter(sql, cn); 
      //dsm = new DataSet(); 
      dad.Fill(dsm, "entete"); 

      List<string> ListEntete = new List<string>(); 

      for (int i = 0; i <= 13; i++) 
      { 
       ListEntete.Add(dsm.Tables["entete"].Rows[0][i].ToString()); 
      } 

      list.Add("entete", ListEntete); 
     } 
     catch (SqlException e) 
     { 

      cn.Close(); 
      cn1.Close(); 
     } 

然而,我所有的查詢都是正確的,因爲我在另一個項目中使用它們。

預先感謝您的幫助

+1

Offtopic:請使用參數化的SQL查詢:http://stackoverflow.com/questions/35163361/how-can-i-add-user-supplied-input-to -an-sql-statement – RvdK

+0

???我不明白,這不是我的問題的解決方案 –

+0

@ValentinHrg:這就是爲什麼我說_offtopic_ – RvdK

回答

0

在我看來,你的問題是你指定查詢到SQL變量。

sql = "(SELECT 'Périodes' as entite,'" + dtm.Rows[0][0].ToString() + "<br>" + dtm.Rows[0][1].ToString() + "' as M01,'" + dtm.Rows[1][0].ToString() + "<br>" + dtm.Rows[1][1].ToString() + "' as M02,'" + dtm.Rows[2][0].ToString() + "<br>" + dtm.Rows[2][1].ToString() + "' as M03,'" + dtm.Rows[3][0].ToString() + "<br>" + dtm.Rows[3][1].ToString() + "' as M04,'" + dtm.Rows[4][0].ToString() + "<br>" + dtm.Rows[4][1].ToString() + "' as M05,'" + dtm.Rows[5][0].ToString() + "<br>" + dtm.Rows[5][1].ToString() + "' as M06,'" + dtm.Rows[6][0].ToString() + "<br>" + dtm.Rows[6][1].ToString() + "' as M07,'" + dtm.Rows[7][0].ToString() + "<br>" + dtm.Rows[7][1].ToString() + "' as M08,'" + dtm.Rows[8][0].ToString() + "<br>" + dtm.Rows[8][1].ToString() + "' as M09,'" + dtm.Rows[9][0].ToString() + "<br>" + dtm.Rows[9][1].ToString() + "' as M10,'" + dtm.Rows[10][0].ToString() + "<br>" + dtm.Rows[10][1].ToString() + "' as M11,'" + dtm.Rows[11][0].ToString() + "<br>" + dtm.Rows[11][1].ToString() + "' as M12,'Total' as TT) "; 

您引用dtm.Rows [0]但是dtm尚未填充任何行,只要我可以看到。

+0

感謝您的回答,但dtm.Rows [0]已填充。我沒有重寫任何填充dtm的代碼 –

+0

這個SQL將不起作用'
'無效SQL – Liam

+0

@ValentinHrg表*是*不填充,至少不是這個代碼。發佈實際證明問題的代碼。儘管我強烈建議首先清理它 - 例如,爲什麼當你可以將'dtm.Rows [0]'存儲在一個變量中時,一直寫'dtm.Rows [0] [0]',然後使用'myRow [0] ','myRow [1]'? –

1

這是全碼:

public Dictionary<string, object> getPICv2(string Tdate_d, string Ddl_fampic, string Ddl_donnee, string Ddl_detail, string Ddl_caracteristique, string Ddl_poste, string Ddl_ilot, string Ddl_nposte, string Ddl_atelier, string Ddl_tposte) 
     { 
      Dictionary<string, object> list = new Dictionary<string, object>(); 

      SqlDataAdapter dac, dad, dam; 
      DataSet dsm = new DataSet(); 
      DataSet dsp = new DataSet(); 
      DataSet dsd = new DataSet(); 
      DataSet dsc = new DataSet(); 
      DataSet dsb = new DataSet(); 
      DataTable dtm = new DataTable(); 
      DataTable dtc = new DataTable(); 
      DataTable dtv = new DataTable(); 
      DataTable dts = new DataTable(); 
      DataTable dtp2 = new DataTable(); 
      DataTable dtp3 = new DataTable(); 


      SqlConnection cn, cn1; 
      SqlCommand cmd1; 
      string sql = "", test = ""; 

      cn = new SqlConnection(CS_PMI); 
      cn.Open(); 

      cn1 = new SqlConnection(CS_DW); 
      cn1.Open(); 
      sql = ""; 


      // entête 

      // lecture des mois sur la période 

      sql = "SELECT year(CAKJDATE),convert(varchar,DateName(month , DateAdd(month , month(CAKJDATE) , -1))),'01/'+substring(CAKJDATE,5,2)+'/'+substring(CAKJDATE,1,4),COUNT(*) "; 
      sql = sql + "FROM [PMI].[dbo].[CALEND] "; 
      sql = sql + "where CAKTSOC='100' and CAKTTYPE='01' and CAKTCODE='' and CACTACTIF='O' "; 
      sql = sql + "and cast(CAKJDATE as datetime)>=convert(varchar,'" + Tdate_d + "',103) and cast(CAKJDATE as datetime)< convert(varchar,cast('" + Tdate_d + "' as datetime)+390,103) "; 
      sql = sql + "group by convert(varchar,DateName(month , DateAdd(month , month([CAKJDATE]) , -1))),month([CAKJDATE]),year([CAKJDATE]),'01/'+substring(CAKJDATE,5,2)+'/'+substring(CAKJDATE,1,4) "; 
      sql = sql + "order by year([CAKJDATE]),month([CAKJDATE]); "; 


      try 
      { 
       dam = new SqlDataAdapter(sql, cn); 
       dsm = new DataSet(); 
       dam.Fill(dsm, "lstmois"); 
       dtm = dsm.Tables["lstmois"]; 

       //Lblerreur.Text = dtm.Rows[1][2].ToString(); 
      } 
      catch (SqlException e) 
      { 

       cn.Close(); 
       cn1.Close(); 
      } 

      // construction ligne entete du tableau 
      sql = "(SELECT 'Périodes' as entite,'" + dtm.Rows[0][0].ToString() + "<br>" + dtm.Rows[0][1].ToString() + "' as M01,'" + dtm.Rows[1][0].ToString() + "<br>" + dtm.Rows[1][1].ToString() + "' as M02,'" + dtm.Rows[2][0].ToString() + "<br>" + dtm.Rows[2][1].ToString() + "' as M03,'" + dtm.Rows[3][0].ToString() + "<br>" + dtm.Rows[3][1].ToString() + "' as M04,'" + dtm.Rows[4][0].ToString() + "<br>" + dtm.Rows[4][1].ToString() + "' as M05,'" + dtm.Rows[5][0].ToString() + "<br>" + dtm.Rows[5][1].ToString() + "' as M06,'" + dtm.Rows[6][0].ToString() + "<br>" + dtm.Rows[6][1].ToString() + "' as M07,'" + dtm.Rows[7][0].ToString() + "<br>" + dtm.Rows[7][1].ToString() + "' as M08,'" + dtm.Rows[8][0].ToString() + "<br>" + dtm.Rows[8][1].ToString() + "' as M09,'" + dtm.Rows[9][0].ToString() + "<br>" + dtm.Rows[9][1].ToString() + "' as M10,'" + dtm.Rows[10][0].ToString() + "<br>" + dtm.Rows[10][1].ToString() + "' as M11,'" + dtm.Rows[11][0].ToString() + "<br>" + dtm.Rows[11][1].ToString() + "' as M12,'Total' as TT) "; 

      try 
      { 
       dad = new SqlDataAdapter(sql, cn); 
       //dsm = new DataSet(); 
       dad.Fill(dsm, "entete"); 

       List<string> ListEntete = new List<string>(); 

       for (int i = 0; i <= 13; i++) 
       { 
        ListEntete.Add(dsm.Tables["entete"].Rows[0][i].ToString()); 
       } 

       list.Add("entete", ListEntete); 
      } 
      catch (SqlException e) 
      { 

       cn.Close(); 
       cn1.Close(); 
      } 
+0

更新你的問題,不要添加答案。並檢查大查詢*是否返回結果。最有可能的不是 –

+0

*並且*它應該被參數化,日期和日期之間的轉換以及varchar被移除。 99,995%這就是導致查詢不返回任何內容的原因 –

+0

所有您需要的是@和@startDate和@ endDate之間的CAKJDATA,其中'@ starDate'和'@ endDate'作爲日期時間參數傳遞。 「group by」這一行有什麼用途? –