CYQ.Data 轻量数据访问层(九) 自定义数据表实现绑定常用的数据控件(下)
数据 实现 常用 自定义 访问 控件 Data 绑定
2023-09-11 14:20:07 时间
继上一篇已过两月有余,上一篇时正巧遇出差。回来时找不到当初的demo程序,于是此系列就暂时放下了。
上一篇:CYQ.Data 轻量数据访问层(六) 自定义数据表实现绑定常用的数据控件(中)
不过,还是得补一篇下,先让它为之小小完整一下:
还记得当初以为似找到:行数组Copy之后,再array.GetEnumerator();就可行。
实际操作之后,发现不可行,于是,这不可行的路就不写了,避免浪费大伙精力看了。
以下讲可行之路:
通过Reflector找到SqlDataReader类,因为它也是可绑定之一的数据源,虽然直拉绑定往往造成链接未关闭事件。
通过研究:
public abstract class DbDataReader : MarshalByRefObject, IDataReader, IDisposable, IDataRecord, IEnumerable
这里,我们的MDataTable只要继承自中间的IDataReader, IEnumerable两个即可,就可以实现绑定之路了。
继承之后,当然就是要实现其它接口了:
![ExpandedBlockStart.gif](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
![复制代码](http://common.cnblogs.com/images/copycode.gif)
public void Close()
{
_Mdr.Clear();
}
public int Depth
{
get
{
if (_Mdr != null)
{
return _Mdr.Count;
}
return 0;
}
}
public DataTable GetSchemaTable()
{
return null;
}
public bool IsClosed
{
get
{
return true;
}
}
public bool NextResult()
{
if (_Ptr _Mdr.Count - 1)
{
return true;
}
else
{
return false;
}
}
public bool Read()
{
if (_Ptr _Mdr.Count)
{
_Ptr++;
return true;
}
else
{
return false;
}
}
public int RecordsAffected
{
get
{
return -1;
}
}
#endregion
#region IDataRecord 成员
private int _Ptr = 0;
public int FieldCount
{
get
{
if (this.Columns != null)
{
return this.Columns.Count;
}
return 0;
}
}
public bool GetBoolean(int i)
{
return (bool)_Mdr[_Ptr][i].Value;
}
public byte GetByte(int i)
{
return (byte)_Mdr[_Ptr][i].Value;
}
public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
{
throw new Exception("The method or operation is not implemented.");
}
public char GetChar(int i)
{
return (char)_Mdr[_Ptr][i].Value;
}
public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
{
throw new Exception("The method or operation is not implemented.");
}
public IDataReader GetData(int i)
{
return this;
}
public string GetDataTypeName(int i)
{
return DataType.GetDbTypeFromSqlDbType(_Mdr[_Ptr].Columns[i].SqlType.ToString()).ToString();
}
public DateTime GetDateTime(int i)
{
return (DateTime)_Mdr[_Ptr][i].Value;
}
public decimal GetDecimal(int i)
{
return (decimal)_Mdr[_Ptr][i].Value;
}
public double GetDouble(int i)
{
return (double)_Mdr[_Ptr][i].Value;
}
public Type GetFieldType(int i)
{
return Type.GetType("System." + GetDataTypeName(i));
}
public float GetFloat(int i)
{
return (float)_Mdr[_Ptr][i].Value;
}
public Guid GetGuid(int i)
{
return (Guid)_Mdr[_Ptr][i].Value;
}
public short GetInt16(int i)
{
return (short)_Mdr[_Ptr][i].Value;
}
public int GetInt32(int i)
{
return (int)_Mdr[_Ptr][i].Value;
}
public long GetInt64(int i)
{
return (long)_Mdr[_Ptr][i].Value;
}
public string GetName(int i)
{
return _Mdr[_Ptr][i].ColumnName;
}
public int GetOrdinal(string name)
{
throw new Exception("The method or operation is not implemented.");
}
public string GetString(int i)
{
return _Mdr[_Ptr][i].ColumnName.ToString();
}
public object GetValue(int i)
{
return null;
//return _Mdr[_Ptr][i-1].Value;
}
public int GetValues(object[] values)
{
for (int i = 0; i values.Length; i++)
{
values[i] = _Mdr[_Ptr - 1][i].Value;
}
return values.Length;
}
public bool IsDBNull(int i)
{
return _Mdr[_Ptr][i].IsNull;
}
public object this[string name]
{
get
{
return null;
}
}
public object this[int i]
{
get
{
return _Mdr[i];
}
}
#endregion
#region IEnumerable 成员
public IEnumerator GetEnumerator()
{
return new System.Data.Common.DbEnumerator(this);
}
#endregion
![复制代码](http://common.cnblogs.com/images/copycode.gif)
至此,MDataTable已经可以替代常用的DataTable了。
同样具有常见的行,列,数据结构,绑定控件等功能。
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/01/29/1658976.html
1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码) 1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主从库、多库的需求。
相关文章
- Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
- CYQ.Data 轻量数据访问层(七) 自定义数据表实现绑定常用的数据控件(上)
- CYQ.Data 轻量数据访问层(九) 自定义数据表实现绑定常用的数据控件(下)
- Oracle用imp和exp实现数据的导入和导出
- 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化
- 数据分析技术:数据差异的显著性检验
- js es6 reduce用法示例:实现数据累加
- 大数据研究常用软件工具与应用场景
- Atitit 提升开发效率 通道化驱动化数据操作与查询 目录 1. xiaoguo1 1.1. Atitit mybatis 简化开发与提升开发效率法1 2. Code1 3. ref4
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
- Atitit.并发测试解决方案(2) -----获取随机数据库记录 随机抽取数据 随机排序 原理and实现
- NLP:自然语言处理技术中常用的文本特征表示方法之字典特征抽取(对字典型数据通过特征抽取和向量化进而实现特征数字化,one-hot编码/仅有值稀疏矩阵,如对类别型特征转换数字型)代码实现
- ML之FE:特征工程中常用的五大数据集划分方法(留1法/留p法、随机划分法、K折交叉验证法、自定义分割法、特殊类型数据分割法【时间序列数据】、自助采样法)理论讲解及其代码实现
- Py之seaborn:数据可视化seaborn库(一)的柱状图、箱线图(置信区间图)、散点图/折线图、核密度图/等高线图、盒形图/小提琴图/LV多框图实现的十二个函数源代码详解之最强攻略(建议收藏)
- DL之RBM:(sklearn自带数据集为1797个样本*64个特征+5倍数据集)深度学习之BRBM模型学习+LR进行分类实现手写数字图识别
- OBS数据采集及渲染过程
- Pytorch入门与实践——AI插画师:生成对抗网络数据集制作
- 大规模数据如何实现数据的高效追溯?
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
- tflearn数据预处理
- js根据数据关键字实现模糊查询功能
- DL之CNN:基于CRNN_OCR算法(keras,CNN+RNN)利用数据集(torch,mdb格式)训练来实现新图片上不定长度字符串进行识别—预测过程