![]() | CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
MDataTable 原理解析 数据控件绑定-续篇
框架原理 |
|
|
| #楼主 |
本篇,将续篇讲解整框架当初的设计思路: 在:MDataTable 原理解析 数据控件绑定-下篇 之后,离最后一步的实现MDataTable绑定 GridView/DataList/Repeater还差一点,这章续上! 在写完上一篇之后,我们的测试结果里,并没有完成绑定功能,我们来看一下测试代码: ![]() ![]() MDataTable table=new MDataTable("myTableName"); table.Columns.Add("Url", SqlDbType.NVarChar); table.Columns.Add("Name",SqlDbType.NVarChar); MDataRow mdr = table.NewRow(); mdr[0].Value = "http://cyq1162.cnblogs.com/"; mdr[1].Value = "路过秋天"; table.Rows.Add(mdr); GridView1.DataSource = table; GridView1.DataBind();
我们像普通的DataTable一样,添加了两列,然后对列赋值: 我们看一下测试的结果: 很明显,绑定的结果乱七杂八,不是我们想要的。
经过代码对比,发现,我们的MDataRow得实现IDataRecord接口才行,于是,让IDataRecord继承接口,并实现: ![]() ![]() public class MDataRow : List<MDataCell>, IDataRecord { /// ...省略N行已有代码... #region IDataRecord 成员 int IDataRecord.FieldCount { get { return base.Count; } } bool IDataRecord.GetBoolean(int i) { return (bool)this[i].Value; } byte IDataRecord.GetByte(int i) { return (byte)this[i].Value; } long IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) { throw new Exception("The method or operation is not implemented."); } char IDataRecord.GetChar(int i) { return (char)this[i].Value; } long IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) { return (long)this[i].Value; } IDataReader IDataRecord.GetData(int i) { throw new Exception("The method or operation is not implemented."); } string IDataRecord.GetDataTypeName(int i) { return (string)this[i].Value; } DateTime IDataRecord.GetDateTime(int i) { return (DateTime)this[i].Value; } decimal IDataRecord.GetDecimal(int i) { return (decimal)this[i].Value; } double IDataRecord.GetDouble(int i) { return (double)this[i].Value; } Type IDataRecord.GetFieldType(int i) { return this[i].Value.GetType(); } float IDataRecord.GetFloat(int i) { return (float)this[i].Value; } Guid IDataRecord.GetGuid(int i) { return (Guid)this[i].Value; } short IDataRecord.GetInt16(int i) { return (short)this[i].Value; } int IDataRecord.GetInt32(int i) { return (int)this[i].Value; } long IDataRecord.GetInt64(int i) { return (long)this[i].Value; } string IDataRecord.GetName(int i) { return (string)this[i].Value; } int IDataRecord.GetOrdinal(string name) { return (int)this[name].Value; } string IDataRecord.GetString(int i) { return (string)this[i].Value; } object IDataRecord.GetValue(int i) { return this[i].Value; } int IDataRecord.GetValues(object[] values) { return 0; } bool IDataRecord.IsDBNull(int i) { return this[i].Value == DBNull.Value; } object IDataRecord.this[string name] { get { return this[name].Value; } } object IDataRecord.this[int i] { get { return this[i].Value; } } #endregion }
接着浏览了一下,不见啥效果。
于是又对比了一下代码,发现原来的MDataTable是采用继承方式List<MDataRow>, 于是,把它给弄到下面来了: ![]() ![]() public class MDataTable : IDataReader, IEnumerable { private List<MDataRow> _Mdr; public List<MDataRow> Rows { get { return _Mdr; } } //...下面省略N行... } 接着小调整了一下,再次浏览,终于效果出来了: 至此,整个框架三部分中自定义MDataTable系列,就到此结束了。 ![]() |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我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年就过了!!!!