CYQ.Data 数据层框架

CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。

MDataTable 原理解析 数据控件绑定-续篇

框架原理 | | | 发表日期 :2010/12/31 10:50:31#楼主  

本篇,将续篇讲解整框架当初的设计思路:

在: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系列,就到此结束了。



新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

发表评论

论坛公告

    数据框架 CYQ.Data QQ群:6033006
    使用本框架进行开发,入门简单,开发效率高,性能优越,更有详尽的API文档,有相关的使用帮助文章、示例文章、更甚有相关的视频教程及辅助工具。 关键还是免费与开源,实在是居家旅行、项目开发、学习研究的必备良品!!!!!!


    在线帮助:欢迎联系

帖子搜索