- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个看起来像这样的 XML:
<resultset>
<datarow>
<datacol>Row 1 - Col 1</datacol>
<datacol>Row 1 - Col 2</datacol>
<datacol>Row 1 - Col 3</datacol>
...
</datarow>
...
</resultset>
...
我的问题是,如何使用此 XML 实现 IDataReader 接口(interface)?我迷路了……
我开发了这个:
public sealed class SybaseDataReader : IDataReader
{
private DataSet _dataSet = new DataSet();
#region IDataReader methods implementation
// ...
}
我的路还好吗?
感谢建设性和解释清楚的帖子。
最佳答案
我写了一个简单的文件阅读器实现。您可以轻松地调整它以读取 xml 文件:
public class MyFileDataReader : IDataReader
{
protected StreamReader Stream { get; set; }
protected object[] Values;
protected bool Eof { get; set; }
protected string CurrentRecord { get; set; }
protected int CurrentIndex { get; set; }
public MyFileDataReader(string fileName)
{
Stream = new StreamReader(fileName);
Values = new object[this.FieldCount];
}
请记住,IDataReader 有几个您不需要实现的方法,具体取决于您的场景。但可能有一些方法实现是您无法避免的:
public void Close()
{
Array.Clear(Values, 0, Values.Length);
Stream.Close();
Stream.Dispose();
}
public int Depth
{
get { return 0; }
}
public DataTable GetSchemaTable()
{
// avoid to implement several methods if your scenario do not demand it
throw new NotImplementedException();
}
public bool IsClosed
{
get { return Eof; }
}
public bool NextResult()
{
return false;
}
public bool Read()
{
CurrentRecord = Stream.ReadLine();
Eof = CurrentRecord == null;
if (!Eof)
{
Fill(Values);
CurrentIndex++;
}
return !Eof;
}
private void Fill(object[] values)
{
//To simplify the implementation, lets assume here that the table have just 3
//columns: the primary key, and 2 string columns. And the file is fixed column formatted
//and have 2 columns: the first with width 12 and the second with width 40. Said that, we can do as follows
values[0] = null;
values[1] = CurrentRecord.Substring(0, 12).Trim();
values[2] = CurrentRecord.Substring(12, 40).Trim();
// by default, the first position of the array hold the value that will be
// inserted at the first column of the table, and so on
// lets assume here that the primary key is auto-generated
// if the file is xml we could parse the nodes instead of Substring operations
}
public int RecordsAffected
{
get { return -1; }
}
要实现 IDataReader,还必须实现 IDisposable 和 IDataRecord 接口(interface)。
IDisposable 很容易,但 IDataRecord 可能会很痛苦。同样,在这种情况下,有一些我们无法避免的方法实现:
public int FieldCount
{
get { return 3;//assuming the table has 3 columns }
}
public IDataReader GetData(int i)
{
if (i == 0)
return this;
return null;
}
public string GetDataTypeName(int i)
{
return "String";
}
public string GetName(int i)
{
return Values[i].ToString();
}
public string GetString(int i)
{
return Values[i].ToString();
}
public object GetValue(int i)
{
return Values[i];
}
public int GetValues(object[] values)
{
Fill(values);
Array.Copy(values, Values, this.FieldCount);
return this.FieldCount;
}
public object this[int i]
{
get { return Values[i]; }
}
希望对您有所帮助。
关于c# - 如何实现 IDataReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354533/
我有两种情况从IDataReader对象中提取信息 Case - 1 - 长度,计算序数然后解析字符串 public static string GetString(IDataReader rdr,
我正在编写一个类,它封装了使用 ADO.NET 从数据库中检索数据的复杂性。其核心方法是 private void Read(Action action) where T : class, new()
实际上不一定是 IDataReader . 我有一个类似这样的函数: public IEnumerable GetObjects() { IDataReader dr = GetSomeDataR
我有一个看起来像这样的 XML: Row 1 - Col 1 Row 1 - Col 2 Row 1 - Col 3 ...
出于某种原因,这段代码: MethodInfo iDataReaderIndexerProperty = typeof(IDataReader).GetProperties() .Single
我正在尝试创建一个“Helper”类,您只需在其中传递驱动程序和参数,该类就会为您执行连接和连接字符串组装。 我一直在使用 System.Data 的接口(interface),例如 IDataRea
这个问题在这里已经有了答案: Does casting create new object? (3 个答案) 关闭 4 年前。 假设我创建了一个数据读取器。 我的数据库类中有一个方法 - 以这种方式
如何使用泛型将 DataReader 对象映射到类对象? 例如我需要做以下事情: public class Mapper { public static List MapObj
谁能告诉我这两段代码的区别?为什么要使用 IDataReader? using (IDataReader reader = cmd.ExecuteReader()) { while (read
在使用 reader.Read(); 遍历行之前,是否有任何方法可以获取从 SQL 查询(从 IDataReader)返回的总行数? 最佳答案 没有。 IDataReader 是结果集的简单只进 Vi
我有一个 List有一百万个元素。 (它实际上是一个 SubSonic Collection 但它不是从数据库加载的)。 我目前使用 SqlBulkCopy 如下: private string Fa
我继承的典型查询执行模式是这样的: using (IDataReader r = query.ExecuteReader()) { while (r.Read()) { // etc.
我正在考虑在 IDataReader 上模拟一个扩展方法(在项目中使用) . ReadAll()时我想返回一个测试数据集合(下)被调用。 public static IEnumerable ReadA
我正在尝试确定代码库中是否存在明显的错误。 有问题的代码调用第三方 dll,它返回一个 IDataReader。如果代码使用读取器而不处理它,它不会显式返回到池中,对吗? 调用代码如下: IDataR
我正在为 map 实体和数据集使用 AutoMapper AutoMapper.Mapper.CreateMap(): 并且我在 Home 实体中有一个名为 MobileNumber 的属性,并且想在
我正在做一个大规模的插入/更新操作。 所以我正在使用 SqlBulkCopy。 SqlConnection myConnection = new SqlConnection(myConnectionS
我在窗口 C# vs05 上工作。我想通过 IDataReader 读取图像....在 oledb 中....我该怎么做假设我想从数据库列名称学生 ID 中读取 int 值然后我用下面的方式编写代码
我想从数据库中读取数据到列表。 我试过下面的代码 public List StoredProcedureForIList(string spName, params IDataParameter[]
我正在尝试将 SQL 数据库中的数据(1 个表中的 4 列)加载到一个列表中,到目前为止已经完成了 List FNameList = (from IDataRecord r in myReader
在使用 IDataReader 对象(DbDataReader)中包含的信息加载它后,我试图向 DataTable 添加一个新条目> 具体来说。加载顺利,我认为对数据库的查询是正确的。 尝试添加新行时
我是一名优秀的程序员,十分优秀!