CYQ.Data 数据层框架

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

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

框架原理 | | | 发表日期 :2010/12/31 10:45:36#楼主  
还记得当初以为似找到:行数组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了。

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



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

发表评论

论坛公告

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


    在线帮助:欢迎联系

帖子搜索