我把XML数据读取到datatable中。然后用datatable.select("id=" & id)这样进行筛选绑定,如果id<10的话,没有问题。数据都能读出来。但如果id>=10时。不能读出数据!!没想什么原因!!
   顺便提醒大家。不是传值的问题。我直接写成:datatable.select("id=10")也不行!!极郁闷中。。高手们路过支招!!!

解决方案 »

  1.   

    1:xml构十行数据吗?
    2:单步调试,看看datatable中的数据.
      

  2.   

    如果本来就没有id>10的数据,你怎么解决也是解决不了的。
    你还是先看看吧。
      

  3.   

    调式看看你的DataTable中存的是什么
      

  4.   

    看看你datatable的id列是字符串还是int型的,估计是select的时候因为字段是字符串型,比较就当作字符串来比较了。
      

  5.   

    准备xml的时候同时准备Schema
    下面是一个简单的示例
    using System;
    using System.Reflection;
    using System.Data;
    using System.Xml;
    using System.IO;
    using System.Text;
    class A
    {
       
        public static void Main(String[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("str", typeof(string));
            dt.Rows.Add(new object[] {9,"9" });
            dt.Rows.Add(new object[] { 10, "10" });
            dt.Rows.Add(new object[] { 11, "11" });
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            //不同时写入Schema.则读取出来时因为无法分析数据格式可能导至select出错
            //ds.WriteXml("xmlfile");
            ds.WriteXml("xmlfilewithschema",XmlWriteMode.WriteSchema);
            ds.Tables.Remove(dt);        //同时读出时也带着Schema一起读出可以有效还原数据格式
            //ds.ReadXml("xmlfile");
            ds.ReadXml("xmlfilewithschema", XmlReadMode.ReadSchema);
            dt = ds.Tables[0];
           
            PrintTable(dt,"id=10");
            PrintTable(dt, "id>10");
            PrintTable(dt, "id<10");
            
            Console.Read();
                   
        }    static void PrintTable(DataTable dt,string condition)
        {
            
            DataRow[] drs = dt.Select(condition);
            
            Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
            foreach(DataRow dr in drs){
                foreach (DataColumn col in dt.Columns)
                {
                    Console.Write("{0}:{1}\t",col.Caption,dr[col.Caption] );
                }
                Console.Write("\r\n");
            }
        }
    }
      

  6.   

    幫頂...
    XML取第10筆後的數據好像問題滿多的
      

  7.   

    如果本来就没有id>10的数据,你怎么解决也是解决不了的。
    你还是先看看吧。
      

  8.   

    我说id>=10当然是有啊其它都能读出来。为什么大于等于10以后就不行了呢!!
      

  9.   

    id>=10中的数据里面有非法值
      

  10.   

    我改成int32类型。还是不行!!!!不知道怎么回事了!!
      

  11.   

    id>=10中的数据里面有非法值
    ---------------------------
    怎么还没明白我的意思.我是说我筛选的ID大于或者等于10以后就有问题.并没id>=10这个判断!!
      

  12.   

    using System;
    using System.Data;
    class A
    {
       
        public static void Main(String[] args)
        {
            DataTable dt = CreateTable();
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            ds.WriteXml("xmlfile");
            /*这时候XML文件内容为
             * <?xml version="1.0" standalone="yes"?>
    <NewDataSet>
      <Table1>
        <id>9</id>
        <str>9</str>
      </Table1>
      <Table1>
        <id>10</id>
        <str>10</str>
      </Table1>
      <Table1>
        <id>11</id>
        <str>11</str>
      </Table1>
    </NewDataSet>
             * 稍后读入到datatable时,id字段的类型为String
             */
            ds.Tables.Remove(dt);
            ds.ReadXml("xmlfile");
            dt = ds.Tables[0];
            PrintTable(dt,"id=10");
            PrintTable(dt, "id>10");
            /*这时候select id<10找不到9,实现的细节可能要看select的实现*/
            PrintTable(dt, "id<10");        dt = CreateTable();
            ds = new DataSet();
            ds.Tables.Add(dt);
            ds.WriteXml("xmlfilewithschema", XmlWriteMode.WriteSchema);
            /*这时候XML文件内容为,看 <xs:element name="id" type="xs:int" minOccurs="0" />
             * 配置节决定了id是整型
          * <?xml version="1.0" standalone="yes"?>
    <NewDataSet>
      <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
          <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="Table1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="id" type="xs:int" minOccurs="0" />
                    <xs:element name="str" type="xs:string" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:schema>
      <Table1>
        <id>9</id>
        <str>9</str>
      </Table1>
      <Table1>
        <id>10</id>
        <str>10</str>
      </Table1>
      <Table1>
        <id>11</id>
        <str>11</str>
      </Table1>
    </NewDataSet>
          * 稍后读入到datatable时,id字段的类型为int32
          */
            ds.Tables.Remove(dt);
            ds.ReadXml("xmlfilewithschema", XmlReadMode.ReadSchema);
            dt = ds.Tables[0];
            PrintTable(dt, "id=10");
            PrintTable(dt, "id>10");
            PrintTable(dt, "id<10");
            Console.Read();
                   
        }    static DataTable CreateTable() {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("str", typeof(string));
            dt.Rows.Add(new object[] { 9, "9" });
            dt.Rows.Add(new object[] { 10, "10" });
            dt.Rows.Add(new object[] { 11, "11" });
            return dt;
        }    static void PrintTable(DataTable dt,string condition)
        {
            
            DataRow[] drs = dt.Select(condition);
            Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
            foreach (DataColumn col in dt.Columns)
            {
                Console.Write("{0}:{1}\t", col.Caption, col.DataType.Name);
            }
            Console.Write("\r\n");
            foreach(DataRow dr in drs){
                foreach (DataColumn col in dt.Columns)
                {
                    Console.Write("{0}\t",dr[col.Caption] );
                }
                Console.Write("\r\n");
            }
        }
    }
    =====运行结果条件:id=10记录数:1
    id:String       str:String
    10      10
    条件:id>10记录数:1
    id:String       str:String
    11      11
    条件:id<10记录数:0
    id:String       str:String
    条件:id=10记录数:1
    id:Int32        str:String
    10      10
    条件:id>10记录数:1
    id:Int32        str:String
    11      11
    条件:id<10记录数:1
    id:Int32        str:String
    9       9
      

  13.   

    我觉得是 Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);的问题,drs.Length 是dtrow的长度,不是 dt 的长度
      

  14.   


    blackant2(寻找武汉工作机会QQ17754266email:[email protected]) ( ) 信誉:100 
    辛苦了!!源碼:
        ''' <summary>
        ''' 根据ID,XML文件返回BBS主题
        ''' </summary>
        ''' <param name="id"></param>
        ''' <param name="path"></param>
        ''' <returns></returns>
        ''' <res></res>
        Public Function getbbs(ByVal [id] As Integer, ByVal path As String) As DataView
            Dim dt As DataTable = New DataTable()        Dim dtr As DataTable = New DataTable()
            dtr.Columns.Add("id", GetType(Int32))
            dtr.Columns.Add("content", GetType(String))
            dtr.Columns.Add("author", GetType(String))
            dtr.Columns.Add("date", GetType(String))
            dtr.Columns.Add("title", GetType(String))
            dtr.Columns.Add("new", GetType(String))       //这列是没用的.如果不添加就说我添加的列太少.内容超填充不了!!不知为何!!        dtr.Columns.Add("ip", GetType(String))        Dim dv As DataView = New DataView()
            Dim stream As FileStream = New FileStream(Server.MapPath(path), FileMode.Open)
            Dim doc As XmlDataDocument = New XmlDataDocument
            doc.DataSet.ReadXml(New StreamReader(stream))
            dt = doc.DataSet.Tables(0)        Dim dr() As DataRow = dt.Select("[id]=" & [id])
            Dim i As Integer
            For i = 0 To dr.Length - 1
                dtr.Rows.Add(New Object() {dr(i).Item("id"), dr(i).Item("content").ToString, dr(i).Item("author").ToString, dr(i).Item("date").ToString, dr(i).Item("title").ToString, dr(i).Item("date").ToString, dr(i).Item("ip").ToString})
            Next
            dv = dtr.DefaultView
            stream.Close()
            Return dv
        End Function
    返回一个dataview!!!大家帮忙看看!!
      

  15.   

    Dim dr() As DataRow = dt.Select("[id]=" & [id])
    Dim i As Integer
    For i = 0 To dr.Length - 1
    dtr.Rows.Add(New Object() {dr(i).Item("id"), dr(i).Item("content").ToString, dr(i).Item("author").ToString, dr(i).Item("date").ToString, dr(i).Item("title").ToString, dr(i).Item("date").ToString, dr(i).Item("ip").ToString})
    Next========
    用C#写,不习惯vb
    DataView dv=dt.defaultview;
    for(int i=0;i<dv.rows.count;i++){
       dtr.rows.add(...............);
    }
    dv=dtr.defaultview;
    dv.rowfilter="id>10";
      

  16.   

    其实使用table copy to table的方法给人感觉好笨拙
    另一个可行的方法是使用InferTypedSchema参数进行强类型架构推断(如果xml是良构的,一般不会抛出异常),下面也是一个示例
    using System;
    using System.Data;
    using System.IO;
    using System.Text;
    class A
    {
       
        public static void Main(String[] args)
        {
            string xml = @"<NewDataSet>
    <Table1>
    <id>9</id>
    <str>9</str>
    </Table1>
    <Table1>
    <id>10</id>
    <str>10</str>
    </Table1>
    <Table1>
    <id>11</id>
    <str>11</str>
    </Table1>
    </NewDataSet>";
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(xml));
            DataSet ds = new DataSet();
            //本例中使用推断强类型架构,可以将id推断为byte,同样可以进行比较
            ds.ReadXml(ms, XmlReadMode.InferTypedSchema);
            DataTable dt = ds.Tables[0];
            PrintTable(dt, "id>10");
            PrintTable(dt, "id=10");
            PrintTable(dt, "id<10");        Console.Read();
                   
        }       static void PrintTable(DataTable dt,string condition)
        {
            
            DataRow[] drs = dt.Select(condition);
            Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);
            foreach (DataColumn col in dt.Columns)
            {
                Console.Write("{0}:{1}\t", col.Caption, col.DataType.Name);
            }
            Console.Write("\r\n");
            foreach(DataRow dr in drs){
                foreach (DataColumn col in dt.Columns)
                {
                    Console.Write("{0}\t",dr[col.Caption] );
                }
                Console.Write("\r\n");
            }
        }
    }================运行结果
    条件:id>10记录数:1
    id:Byte str:Byte
    11      11
    条件:id=10记录数:1
    id:Byte str:Byte
    10      10
    条件:id<10记录数:1
    id:Byte str:Byte
    9       9
      

  17.   

    DataView dv=dt.defaultview;
    for(int i=0;i<dv.rows.count;i++){
       dtr.rows.add(...............);
    }
    dv=dtr.defaultview;
    dv.rowfilter="id>10";
    ----------------------------------
    大哥.我已经筛选一次.再筛选一下有用吗?麻烦你改个全一点,C#没事.我能看懂!多谢了!
      

  18.   

    直接用:dv.rowfilter="id=" & id行了!!!!!辛苦各位了!!结了吧!!
      

  19.   

    不明白说什么, 简单的逻辑处理而已, 再不明白输出DataTable 的数据看看
      

  20.   

    楼主的程序中最好不要用datarow.进行过滤,再返回table.dataview dv=tables[0].defaultviewdv.RowFilter = "cint(id)>10";注意数据类型的变化