XCode读取Excel数据(适用于任何数据库)

虽然是充血模型,虽然是强类型,XCode同样支持遍历任何数据库结构,并以强类型(相对于DataSet等字典访问)方式读取数据。

要遍历数据库结构是很容易的事情,绝大多数Orm都支持。

但是在没有实体类的情况下以强类型方式读取数据,就稍微有些复杂。XCode的原理是为每张表动态创建继承自Entity<>的实体类,然后通过接口来操作实体类。

代码中有了快速反射,虽然没有性能损耗,但是用起来挺别扭的,这里说明了XCode对于实体类元数据的动态访问支持还不够。

// 添加一个连接
DAL.AddConnStr("test", "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=Test.xls;" + "Extended Properties=Excel 8.0;", null, null);
DAL dal = DAL.Create("test");
// 遍历所有表
foreach (XTable table in dal.Tables)
{
    Console.WriteLine("表 {0}:", table.Name);

    // 创建一个实体操作者,这里会为数据表动态生成一个实体类,并使用CodeDom编译
    IEntityOperate op = dal.CreateOperate(table.Name.Replace("$", null));

    // 因为动态生成代码的缺陷,表名中的$已经被去掉,并且Excel的查询总必须给表名加上方括号,还是因为有$
    // 下面通过快速反射设置Meta.TableName
    Type type = op.GetType();
    type = typeof(Entity<>.Meta).MakeGenericType(type);
    PropertyInfoX.Create(type, "TableName").SetValue("[" + table.Name + "]");

    // 如果没有记录,跳过
    if (op.FindCount() < 1) continue;

    // 输出表头
    foreach (FieldItem item in op.Fields)
    {
        if (item.Name.StartsWith("F")) break;

        Console.Write("{0}\t", item.Name);
    }
    Console.WriteLine();

    // 查找所有数据
    EntityList<IEntity> list = op.FindAll();
    //DataSet ds = list.ToDataSet();

    // 输出数据
    foreach (IEntity entity in list)
    {
        foreach (FieldItem item in op.Fields)
        {
            if (item.Name.StartsWith("F")) break;

            Console.Write("{0}\t", entity[item.Name]);
        }
        Console.WriteLine();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘

通过《再谈IIS与ASP.NET管道》的介绍,相信读者已经对IIS和ASP.NET的请求处理管道有了一个大致的了解,在此基础上去理解基于IIS服务寄宿的实现机制...

2149
来自专栏张善友的专栏

自定义AuthorizeAttribute

网站的权限判断是一个非常普遍的需求,从文章ASP.NET MVC的Action Filter中我们知道实现这样的需求只要从AuthorizeAttribute集...

22610
来自专栏跟着阿笨一起玩NET

ASP.NET用HttpListener实现文件断点续传

本文转载:http://www.cnblogs.com/TianFang/archive/2007/01/03/610739.html

1031
来自专栏逸鹏说道

EF批量操作数据与缓存扩展框架

在原生的EF框架中,针对批量数据操作的接口有限,EF扩展框架弥补了EF在批量操作时的接口,这些批量操作包括:批量修改、批量查询、批量删除和数据缓存,如果您想在E...

4226
来自专栏乐百川的学习频道

Vert.x学习笔记(二) Vert.x Web Client

本文参考自Vert.x Web Client官方文档。套用官网的话来说, Vert.x Web Client是一个异步的HTTP和HTTP/2网络客户端。 ...

4916
来自专栏Golang语言社区

关于JSON.stringify和Unicode编码,需要注意的几点

1JSON.stringify会自动把所要转换内容中的汉字转换为Unicode编码 2浏览器间有差别,个别浏览器会把将要提交表单内容中的Unicode编码自动转...

3824
来自专栏james大数据架构

MVC中实现加载更多

需要实现的功能: 数据太多想初次加载部分数据,在底部加上“加载更多”按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android...

2465
来自专栏菩提树下的杨过

关于Membership/Role您可能不知道的细节

1.关于System.Web.Security.Membership.ValidateUser("username", "password") 每次调用这个时,...

18610
来自专栏Golang语言社区

[Go 语言社区] Golang架构底层---日志函数

服务器后台架构,日志是必不可少的一个功能模块,日志可以分为很多中:统计日志,访问日志,错误日志等 今天大家发是运行中的日志函数 // 日志函数,传入数据为字...

3336
来自专栏游戏杂谈

cocos2d-x中的curl

使用CURL(Cocos2d-x中将curl做为第三方库加入进来,它被放在cocos2dx/platform/third-party/win32的curl目录下...

881

扫码关注云+社区

领取腾讯云代金券