作者:Scarlett_girl | 来源:互联网 | 2023-09-18 15:31
我把XML数据读取到datatable中。然后用datatable.select(id&id)这样进行筛选绑定,如果id<10的话,没有问题。数据都能读出来。但如果id>
我把XML数据读取到datatable中。然后用datatable.select("id=" & id)这样进行筛选绑定,如果id<10的话,没有问题。数据都能读出来。但如果id>=10时。不能读出数据!!没想什么原因!!
顺便提醒大家。不是传值的问题。我直接写成:datatable.select("id=10")也不行!!极郁闷中。。高手们路过支招!!!
45 个解决方案
1:xml构十行数据吗?
2:单步调试,看看datatable中的数据.
如果本来就没有id>10的数据,你怎么解决也是解决不了的。
你还是先看看吧。
看看你datatable的id列是字符串还是int型的,估计是select的时候因为字段是字符串型,比较就当作字符串来比较了。
准备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");
}
}
}
刚吃完饭回来
楼主可以调试一下进一步看看是哪的问题
是数据类型还是数据源的问题
帮顶
幫頂...
XML取第10筆後的數據好像問題滿多的
如果本来就没有id>10的数据,你怎么解决也是解决不了的。
你还是先看看吧。
我说id>=10当然是有啊。。。其它都能读出来。为什么大于等于10以后就不行了呢!!
我改成int32类型。还是不行!!!!不知道怎么回事了!!
id>=10中的数据里面有非法值
---------------------------
怎么还没明白我的意思.我是说我筛选的ID大于或者等于10以后就有问题.并没id>=10这个判断!!
看来还差一点就解决了,如果楼主把源程序帖出来,说不定我就可以帮帮你了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
接分
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文件内容为
*
9
9
10
10
11
11
* 稍后读入到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文件内容为,看
* 配置节决定了id是整型
*
9
9
10
10
11
11
* 稍后读入到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
我觉得是 Console.WriteLine("条件:{0}记录数:{1}",condition ,drs.Length);的问题,drs.Length 是dtrow的长度,不是 dt 的长度
blackant2(寻找武汉工作机会QQ17754266email:blackant@tt8.cn) ( ) 信誉:100
辛苦了!!
源碼:
'''
''' 根据ID,XML文件返回BBS主题
'''
'''
'''
'''
'''
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!!!大家帮忙看看!!
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 dtr.rows.add(...............);
}
dv=dtr.defaultview;
dv.rowfilter="id>10";
其实使用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 = @"
9
9
10
10
11
11
";
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
DataView dv=dt.defaultview;
for(int i=0;i dtr.rows.add(...............);
}
dv=dtr.defaultview;
dv.rowfilter="id>10";
----------------------------------
大哥.我已经筛选一次.再筛选一下有用吗?麻烦你改个全一点,C#没事.我能看懂!多谢了!
直接用:dv.rowfilter="id=" & id行了!!!!!辛苦各位了!!结了吧!!
不明白说什么, 简单的逻辑处理而已, 再不明白输出DataTable 的数据看看
楼主的程序中最好不要用datarow.进行过滤,再返回table.
dataview dv=tables[0].defaultview
dv.RowFilter = "cint(id)>10";
注意数据类型的变化