CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
MDataTable 原理解析 数据控件绑定-下篇
框架原理 |
|
|
| #楼主 |
还记得当初以为似找到:行数组Copy之后,再array.GetEnumerator();就可行。
实际操作之后,发现不可行,于是,这不可行的路就不写了,避免浪费大伙精力看了。
以下讲可行之路: 通过Reflector找到SqlDataReader类,因为它也是可绑定之一的数据源,虽然直拉绑定往往造成链接未关闭事件。 通过研究: public class SqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord 发现其继承自DbDataReader,于是,点进DbDataReader: public abstract class DbDataReader : MarshalByRefObject, IDataReader, IDisposable, IDataRecord, IEnumerable 这里,我们的MDataTable只要继承自中间的IDataReader, IEnumerable两个即可,就可以实现绑定之路了。 继承之后,当然就是要实现其它接口了: #region IDataReader 成员
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 至此,MDataTable已经可以替代常用的DataTable了。 同样具有常见的行,列,数据结构,绑定控件等功能。 |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我mysql的提示 V5.7.7.4 MySql.xxxx:check the tablename "tbl_site_info" is exist? error:ExeDataReader():Expression #1 of ORDER BY clause is not in SELECT list, references column 'information_schema.s1.ORDINAL_POSITION' which is not in SELECT list; this is incompatible with DISTINCT 配置如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Conn" connectionString="host=192.168.3.101;Port=3306;Database=xxxxx;uid=root;pwd=2017" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
- 查询语句有点问题,软件启动时查询语句可以从数据库查询出数据,软件一直运行时无论怎么修改数据库,查询出来的还是老数据,不知道是为什么
- 我语句中用到了union all而且两个查询都有查询条件,action.select总是不成功,不知道有没有什么好的解决办法,谢谢
- 大神,如果我想通过一个对象(从数据映射过来的)要插入的话,我需要遍历字段然后每个set一下吗?有没有更好的方法??
- 真心好用,想问下秋天直接拼写sql怕注入吗
- V4.5后,好多方法都改变了,求来个新的日志帮助
- 請問大神V5源碼要多少錢 我是和交流過的
- 楼主,,从数据库里查出来并绑定datagridview,但是显示的都是数据库里的英文名,怎么改??好纠结啊这个。。。。
- 我想问一下,主从表添加怎样处理
- 10年就过了!!!!