none
问题:[1#泵故障] 既不是表 baojing 的 DataColumn 也不是 DataRelation RRS feed

  • 问题

  • 我的ASPX.CS页是这样写的
    seach=(string)dr["e_baojing"];  这句话是把别的表里字段读出来,当做sqlstr查询语句条件; 现在取出来的数是:[1#泵故障],[2#泵故障],门磁,高区用户压力 
    conn.Close();
     zdm = seach.Split(',');   //这句是seach里的数分离,分别存到ZDM里
    string sqlstr = "Select 日期," + seach + " from  z_" + tableName1 + "where 日期 between '" + startime + "' and '" + endtime + "'order by 日期 desc";
    conn.Open();
     SqlDataAdapter myda5 = new SqlDataAdapter(sqlstr, conn);
     DataSet myds5 = new DataSet();
     myda5.Fill(myds5, "baojing"); //建立一个以baojing为表明的临时表
     GridView1.DataSource = myds5;
     GridView1.DataBind();
    conn.Close();

     for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
                    {
                        int j = 0;
                        DataRowView mydrv = myds5.Tables["baojing"].DefaultView[i];
                        while (j < zdm.Length)
                        {

                           string score = Convert.ToString(mydrv[zdm[j]]);  //错误提示就是这句报错,这句我是想把数组里的数分别取出来,然后进行后续操作。
                            ~~~~~~~~                                                        现在的问题是,我把seach里的[1#泵故障],[2#泵故障]这两个字段去掉,就能正常显示,可是一加
                                                                                                      上去就不行了!
                    }

    我用的数据库SQL2005 表里的字段里有[1#泵故障],[2#泵故障]

    2009年9月18日 3:38

答案

  • 你好,这个问题其实我一开始就表述得很清楚了。它不是由于 split 的问题,根本原因是你存在数组中的字段名是带方括号的,而通过 SQL 查询出来的数据字段是不带方括号的,所以自动创建的 DataTable 的字段名是不带方括号的。字段名前后不一不致当然会报错咯。
    知识改变命运,奋斗成就人生!
    2009年9月18日 7:09
    版主
  • XXY哥
    我弄好了!
    按这个思路
                    for (int i = 0; i < zdm.Length; i++)    //这个循环是去掉取出字段的[]
                    {
                        zdm[i] = zdm[i].Replace("[", "");
                        zdm[i] = zdm[i].Replace("]", "");
                    }
    我写了这样一段话,把 里面的【】去掉了!
    然后在转过去!
    2009年9月18日 7:23

全部回复

  • 你好,将 [1#泵故障],[2#泵故障] 改为 1#泵故障, 2#泵故障

    出现这样的问题,是SQL要获取数据时会自动将字段的[]去掉,这样通过 Fill 后在 DataTable 的字段名应该中 1#泵故障 和 2#泵故障

    知识改变命运,奋斗成就人生!
    2009年9月18日 3:52
    版主
  • 我改成1#泵故障, 2#泵故障 也是不行,还是提示:1#泵故障 既不是表 baojing 的 DataColumn 也不是 DataRelation

    2009年9月18日 4:14
  • 你打个断点看看 myds5.Tables["baojing"] 中的每个 Column 的名称是什么
    知识改变命运,奋斗成就人生!
    2009年9月18日 4:25
    版主
  • 调试里column里的LIST里面列名是{1#泵故障},{2#泵故障}

    2009年9月18日 4:51
  • 那就是我上面说的原因,你可以修改你的代码将 search 最终值改为 1#泵故障,2#泵故障,门磁,高区用户压力
    知识改变命运,奋斗成就人生!
    2009年9月18日 4:53
    版主
  • Response.Write(seach)看是什么
    【孟子E章】
    2009年9月18日 5:08
    版主
  • 我改了!
    改完就是

    调试里column里的LIST里面列名是{1#泵故障},{2#泵故障},这个提示!
    string score = Convert.ToString(mydrv[zdm[j]]);  还有,如果我吧这句话注释掉,就能正常运行
    现在就是这不能正常转换!

    2009年9月18日 5:10
  • string score = "";
    if(DBNull.Value != mydrv[zdm[j]])
    score  = Convert.ToString(mydrv[zdm[j]]); 

    【孟子E章】
    2009年9月18日 5:11
    版主
  • 还是提示1#泵故障 既不是表 baojing 的 DataColumn 也不是 DataRelation,我把它改成[1#泵故障],提示是[1#泵故障] 既不是表 baojing 的 DataColumn 也不是 DataRelatio
    2009年9月18日 5:24

  • 试试这个
    for (int i = 0; i < myds5.Tables["baojing"].Rows.Count; i++)
    {
      int j = 0;
      DataRow mydrv = myds5.Tables["baojing"].Rows[i];
      for(int j = 0;j<zdm.Length;j++)
      {
        string score = Convert.ToString(mydrv[zdm[j]]);
      }
    }


    【孟子E章】
    2009年9月18日 5:35
    版主
  • 不能用FOR循环,我以前就是这样写的,但是运行很慢,所以我才改成while循环的!

    2009年9月18日 5:47
  • 我你这个弄了!但是提示是:

    列“[1#泵故障]”不属于表 baojing。


    2009年9月18日 5:55
  • xxy老师,我把seach里改成1#泵故障,2#泵故障后,我在 myds5.Tables["baojing"] 打了一个断点,里面显示的 Column 的名称是“{#泵故障},{#泵故障1}”了!请问该怎样解决呀!
    2009年9月18日 6:09
  • 孟老师
    我把seach里改成1#泵故障,2#泵故障后,我在 myds5.Tables["baojing"] 打了一个断点,里面显示的 Column 的名称是“{#泵故障},{#泵故障1}”了!请问该怎样解决呀!

    2009年9月18日 6:10
  • 不能用FOR循环,我以前就是这样写的,但是运行很慢,所以我才改成while循环的!

    不会吧,这个数组才3个值啊。
    【孟子E章】
    2009年9月18日 6:20
    版主

  • mydrv["{#泵故障}"]可以取出值吗

    【孟子E章】
    2009年9月18日 6:21
    版主
  • 使用中文名字做列名,不是一个好的做法,况且又有特殊字符
    【孟子E章】
    2009年9月18日 6:22
    版主
  • // zdm = seach.Split(',');
    // 改为
    zdm = new string[] { "1#泵故障", "2#泵故障", "门磁", "高区用户压力" };
    另外,通过下面的方式获取也是可行的

    foreach (DataRow row in ds.Tables[0].Rows)
    {
        foreach (DataColumn col in ds.Tables[0].Columns)
        {
            string s = row[col.ColumnName].ToString();
        }
    }


    我上午测试了下,的确是我说的原因,我怀疑是你的代码有问题,你先把上面的代码更改一下看看能否执行通过

    知识改变命运,奋斗成就人生!
    2009年9月18日 6:25
    版主
  • 我查出原因了!原因就是这个zdm = seach.Split(',')转的问题,我把它改成
    zdm = new string[] { "1#泵故障", "2#泵故障", "门磁", "高区用户压力" };这个就行,
    但是我的字段自动获取的,这个该怎么解决呀!
    2009年9月18日 6:58
  • 你好,这个问题其实我一开始就表述得很清楚了。它不是由于 split 的问题,根本原因是你存在数组中的字段名是带方括号的,而通过 SQL 查询出来的数据字段是不带方括号的,所以自动创建的 DataTable 的字段名是不带方括号的。字段名前后不一不致当然会报错咯。
    知识改变命运,奋斗成就人生!
    2009年9月18日 7:09
    版主
  • 恩!现在我有个想法,就是我把取出来的数,当赋给数组的时候,把[]都用函数去掉,有这样的函数或者方法吗?

    2009年9月18日 7:11
  • XXY哥
    我弄好了!
    按这个思路
                    for (int i = 0; i < zdm.Length; i++)    //这个循环是去掉取出字段的[]
                    {
                        zdm[i] = zdm[i].Replace("[", "");
                        zdm[i] = zdm[i].Replace("]", "");
                    }
    我写了这样一段话,把 里面的【】去掉了!
    然后在转过去!
    2009年9月18日 7:23
  • 方法有很多,解决就好!
    知识改变命运,奋斗成就人生!
    2009年9月18日 7:30
    版主