2016-11-10 83 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”这一行有什么用途? –