CYQ.Data 轻量数据访问层(九) 自定义数据表实现绑定常用的数据控件(下)-阿里云开发者社区

开发者社区> 泡泡浅眠> 正文

CYQ.Data 轻量数据访问层(九) 自定义数据表实现绑定常用的数据控件(下)

简介:
+关注继续查看

继上一篇已过两月有余,上一篇时正巧遇出差。回来时找不到当初的demo程序,于是此系列就暂时放下了。

上一篇:CYQ.Data 轻量数据访问层(六) 自定义数据表实现绑定常用的数据控件(中)

不过,还是得补一篇下,先让它为之小小完整一下:


还记得当初以为似找到:行数组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两个即可,就可以实现绑定之路了。

继承之后,当然就是要实现其它接口了:

 

ExpandedBlockStart.gif
复制代码
 #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了。

同样具有常见的行,列,数据结构,绑定控件等功能。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/01/29/1658976.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
DataRabbit 轻量的数据访问框架(02) -- IOrmAccesser
(完全限定类名:DataRabbit.ORM.IOrmAccesser)      在DataRabbit框架中,通过IOrmAccesser来对数据库进行ORM访问,只要Entity(即ORM中的“O”)的定义与数据库表的结构完全一致,即可使用IOrmAccesser来对其进行ORM操作。
728 0
DataRabbit 轻量的数据访问框架(01) -- ITransactionAccesser
(完全限定类名:DataRabbit.ITransactionAccesser)    在DataRabbit 轻量的数据访问框架 --序 中,我们已经知道,所有的访问器接口都继承了ITransactionAccesser接口。
654 0
SSRS用自定义对象绑定报表
有一个报表的数据源是一个对象的List, 这个对象List中还有层级,其中还有其他的对象List,这样的层级有三层。其数据是从数据库中取出来的。其LINQ的操作太多了而且复杂,所以不太可 能从LINQ中挖掘出SQL语句了,只能从这个对象List作为报表数据源。
762 0
DataRabbit 轻量的数据访问框架(06) -- IRelationAccesser
(完全限定类名:DataRabbit.Relation.IRelationAccesser)       前面介绍的IOrmAccesser是对单表进行ORM访问,而ITableAccesser是对单表进行基于关系的访问,如果我们要进行联合查询这样的跨表搜索,则使用它们就无法达成目标。
789 0
DataRabbit 轻量的数据访问框架(07) -- ISPAccesser
(完全限定类名:DataRabbit.Relation.ISPAccesser)       虽然IRelationAccesser可以调用一些不含out参数的存储过程,但是在DataRabbit中调用存储过程最好是通过ISPAccesser接口来进行。
806 0
Java Data Access Object Pattern(数据访问对象模式)
数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。
716 0
WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
原文:WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历) 问题:        有一些CheckBox需要作为选项添加到页面上,但是数目不定。
1421 0
DataRabbit 轻量的数据访问框架(10) -- IPagerManager
(完全限定类名:DataRabbit.Core.IPagerManager)   DataRabbit框架提供了对单表查询的结果进行分页的功能,这就是IPagerManager所完成的目标。我们可以从DataRabbit的入口点IDataAccesser中获取IPagerManager引用:     PagerParameters param = .
656 0
+关注
2248
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载