none
【ASP.NET】输入字符串的格式不正确 RRS feed

  • 问题

  • 运行时提示错误:输入字符串的格式不正确。不能在 id 列中存储 <admin>。所需类型是 Int32

    奇怪的问题是明明当前列名为author 类型是varchar类型的,却说不能在id列中存储字符串

    代码如下:

    首先我在外部定义了一个全局变量DataTable Ndt;

    ListBand方法代码如下:

    DataTable Odt = OperateDB.GetDataSet("select * from jinwb", CommandType.Text, "jinwb").Tables[0];
             Ndt = Odt.Clone();//建立一个与dt表结构相同的表
            DataRow[] rows = Odt.Select("ParentID='1'");
            for (int i = 0; i < Odt.Columns.Count; i++)
            {
                DataRow row = Ndt.NewRow(); //新建行
                row[i]=rows[0][i];
                Ndt.Rows.Add(row);
            }
            addOtherDll(Convert.ToInt32(rows[0]["id"]), Odt);

     

    private void addOtherDll(int Id, DataTable Odt)
        {
            DataRow[] rowlist = Odt.Select("ParentID='" + Id + "'");//在原始表查询出ParentID等于ID的数据
          
          
                for (int i = 0; i < rowlist.Length; i++)
                {

                    for (int j = 0; j < Odt.Columns.Count; j++)
                    {
                        DataRow row = Ndt.NewRow();
                        row[i] = rowlist[i][j];     //这里运行出现错误
                        Ndt.Rows.Add(row);
                        //addOtherDll(Convert.ToInt32(row["id"]), Odt);//再次递归
                    }


                }
          

        }

     

     

    以下是表中的数据结构

     

    问题是以上两个表的结构都是一样的,数据也是一样的,我想做的只不过是想利用新表重新排序下原来表中的数据而已

     

    我怀疑是不是声明的DataTable全局变量的问题啊?在第一次向其中填充数据以后,第二次再次填充数据的时候,该表格结构发生了改变,以至于出现以上问题。这是我的猜想而已,具体原因还请高手帮忙分析一下,谢谢!

    • 已移动 孟宪会Moderator 2010年7月22日 8:06 (发件人:.NET Framework 一般性问题讨论区)
    2010年7月14日 4:48

答案

  • 我也不清楚是怎么回事,以上的错误我使用foreach循环解决了

    代码如下:

     foreach (DataRow row in rows)
            {
                DataRow newrow = Ndt.NewRow();
                for (int j = 0; j < Odt.Columns.Count; j++)
                { 
                     newrow[j] = row[j]; 

                }
                 Ndt.Rows.Add(newrow);
                 addOtherDll(Convert.ToInt32(rows[0]["id"]), Odt);//再次递归
                

            }

     

    以上代码替换:

    for (int i = 0; i < rows.Length; i++)
            {

                for (int j = 0; j < Odt.Columns.Count; j++)
                {
                    DataRow row = Ndt.NewRow();
                    row[j] = rows[i][j];
                    Ndt.Rows.Add(row);

                    //addOtherDll(Convert.ToInt32(row["id"]), Odt);//再次递归
                }


            }

     

    问题解决,结贴  感谢大家

    • 已标记为答案 jinwb1982 2010年7月15日 3:46
    2010年7月15日 3:46

全部回复

  • 是你的addOtherDll方法有问题,

    你检查下row[i] = rowlist[i][j];   这句话有问题。

    首先执行外循环,然后执行内循环,

    当i=0,j=0时,这时是给ID赋值,也就是row["id"]=rowlist[0]["id"];

    当i=0,j=1时,这时变成了这种情况 row["id"]=rowlist[0]["name"];,把一个字符串付给了整形的列,数据类型不匹配。

    你改成这样试试,不要采用索引赋值,采用列名赋值

     DataRow[] rowlist = Odt.Select("ParentID='" + Id + "'");//

            DataTable Ndt= Odt.Clone();
                foreach (DataRow item in rowlist)
                {
                    DataRow row = Ndt.NewRow();
                    row["id"] = item["id"];
                    row["name"] = item["name"];
                    Ndt.Rows.Add(row);
                }


    http://blog.csdn.net/zx13525079024
    2010年7月14日 5:43
  • 是你的addOtherDll方法有问题,

    你检查下row[i] = rowlist[i][j];    这句话有问题。

    首先执行外循环,然后执行内循环,

    当i=0,j=0时,这时是给ID赋值,也就是row["id"]=rowlist[0]["id"];

    当i=0,j=1时,这时变成了这种情况 row["id"]=rowlist[0]["name"];,把一个字符串付给了整形的列,数据类型不匹配。

    你改成这样试试,不要采用索引赋值,采用列名赋值

     DataRow[] rowlist = Odt.Select("ParentID='" + Id + "'");//

            DataTable Ndt= Odt.Clone();
                foreach (DataRow item in rowlist)
                {
                    DataRow row = Ndt.NewRow();
                    row["id"] = item["id"];
                    row["name"] = item["name"];
                    Ndt.Rows.Add(row);
                }


    http://blog.csdn.net/zx13525079024

    问题是不是用索引就无法循环为新表的每行填充数据。ListBand方法的for循环中我断点测试了一下,提示错误

    2010年7月14日 6:02
  • 用索引可以为赋值,用列名也可以,用列名更清晰,

    关键是你循环赋值的错误,导致把一个字符串赋值给了整型


    http://blog.csdn.net/zx13525079024
    2010年7月14日 9:47
  • 我也不清楚是怎么回事,以上的错误我使用foreach循环解决了

    代码如下:

     foreach (DataRow row in rows)
            {
                DataRow newrow = Ndt.NewRow();
                for (int j = 0; j < Odt.Columns.Count; j++)
                { 
                     newrow[j] = row[j]; 

                }
                 Ndt.Rows.Add(newrow);
                 addOtherDll(Convert.ToInt32(rows[0]["id"]), Odt);//再次递归
                

            }

     

    以上代码替换:

    for (int i = 0; i < rows.Length; i++)
            {

                for (int j = 0; j < Odt.Columns.Count; j++)
                {
                    DataRow row = Ndt.NewRow();
                    row[j] = rows[i][j];
                    Ndt.Rows.Add(row);

                    //addOtherDll(Convert.ToInt32(row["id"]), Odt);//再次递归
                }


            }

     

    问题解决,结贴  感谢大家

    • 已标记为答案 jinwb1982 2010年7月15日 3:46
    2010年7月15日 3:46