本文想借用故事的方式来说一下ADO.net的工作方式。虽然现在都ORM了但是了解一下ADO.net还是有必要的。在茫茫的大海上有许多的岛其中一个岛的名字叫做“应用程序岛”。这座岛上商业非常发达高楼大厦、店铺林立。但是岛的面积不够大没有地方建立仓库。所以市长决定把临近的一座小岛开发出来专门作为数据仓库来使用这座岛的名字就叫“数据库岛”。市长在数据库岛上面建立了一个MSSQL数据库这样各个商场、超市就可以把自己的货物放进去了。两个岛相邻很近为了便于运输所以直接在两个岛之间建立了五座大桥。并且成了一个“数据访问池”的部门来专门管理这五座桥。有一个叫command的家伙很聪明觉得商机来了于是他就成立了一家Command物流公司专门负责两座岛之间的货物运输。物流公司成立了几个下属部门Connection、DataReader。Connection负责与连接池的联系申请大桥的临时使用权并且还要提供车辆。DataReader负责装卸货物。好了万事具备只欠东风。物流公司成了好了之后就坐等客户上门了。不久来了一位客户是岛上的一个书店他们购进了一批图书需要送到数据库岛的仓库里。【添加记录的情况】Command接到了这个任务很高兴终于开张了。领导当然不能自己亲自去干活了于是派出了明星员工cm007来负责这个任务。SqlCommand cm007 new SqlCommand();Cm007从书店那里得到了指令就是SQL语句和货物来到Connection部门。cm007.CommandText ;Connection部门派出了得力员工cn007SqlConnection cn007 new SqlConnection();cm007.Connection cn007;cn007开着车带着cm007来到了大桥由cn007和连接池联系想要申请一座大桥的临时使用权。cn007.Open();连接池得到了这个申请之后查看了一下大桥的使用情况现在五座大桥都没有人使用于是把001号大桥的使用权交给了cn007。这个时候这座001号大桥就由cm007他们独占了其他任何人都不可以使用。而且是按照独占时间来收取费用的。一行人通过001号大桥来到了数据库cm007把指令交给了数据库管理员开始交货。数据库管理员按照指令把货物放到了指定的位置。办好之后cm007带着数据库的确认证明从大桥返回到了应用程序岛。离开大桥后cn007又给连接池发了一个申请。cn007.Close();连接池得到了这个申请后收回了001号大桥的使用权这样其他人就又可以使用这个大桥了。cm007一行人来到了书店把数据库管理员的证明交给了书店客户很满意这个任务也就完成了。回到物流公司交差。cn007.Dispose();cm007.Dispose();command很高兴首战告捷以后的生意一定会很红火呀。【提取查询记录向上层直接返回DataReader的情况】第二天那家书店又来找command要从数据库岛提五本书过来。又来生意了太好了于是又派出了cm007和cn007。不过这次和昨天不太一样昨天是送货到仓库今天是从仓库提货。这次还需要DataReader派装卸工来配合。轻车熟路cn007开着车带着大家来到了大桥cn007申请了一座大桥的使用权来到了数据库岛cm007把指令交给了数据库管理员开始提货。不过这次却遇到了一点小问题运输车的运载量的太小了一次只能运一本书一条记录。可是这次却需要提五本书五条记录没办法只好多跑几趟了。带上一本书一条记录来到了书店书店老板很高兴这么快就到了呀赶快卸货上架吧。咦等等怎么只有一本书呀。Cm007只好解释我们的车运载量太小了一次只能运一条记录不过速度还是很快的呀。书店老板想了想也凑合了那你们赶快运下一条记录吧。如是这般折腾了五趟总算把货物全都运完了。“等等”cn007说“大桥的使用权还没有交回去呢。”于是大家又来到了桥头把使用权交了回去。最后回到物流公司交差。【改进向上层返回DataTable】这回command可高兴不起来了。大桥是按照占用时间来收费的这么来回折腾大桥的占用时间明显变长了这就增加了成本呀。另外现在汽油这么贵来回折腾烧的可都是钱呀就不能跑一趟多运点吗于是command把大家召集过来一起商量这个事情。cn007说大桥这一段没有什么办法可想了一次只能运出来一条记录这个也不知道是谁规定的我们也改不了。不过从桥头到客户那里我们倒是可以想想办法我有一个朋友DataAdapter他们也许会有办法。Command听了也没有什么其他的方法那就把DataAdapter请过来一起商量一下吧。第二天DataAdapter过来了也带来了他的解决方案。其实也很简单他们公司可以提供集装箱就是DataTable在桥头等待货物运到的时候由DataReader装到集装箱里然后立刻返回运第二批货物。等需要的货物全都装完了之后在开着集装箱运到客户那里。SqlDataAdapter da007 new SqlDataAdapter();DataTable dt007 new DataTable();da007.Fill(dt007);这样就节省了大桥的占用时间节省了成本。到客户的这段路程集装箱跑一趟就可以了省油。这个方案不错command欣然接受。过了几天书店又要提一批图书这次采用了集装箱的方案果然大大节省了成本客户也很满意虽然一开始要等待比较长的时间但是好在一次性就可以得到全部的货物。【多种返回类型DataRow、object[]、object】有一天又发现了一个新问题书店只要一本书。就一本书也弄一个集装箱太浪费了吧。怎么办干脆直接用DataRow吧。实在不行用object[]。对于一条记录也足够用了。【实体类开始登场】于是物流公司的生意是越来越红火了。有一家大型超市也找到了command希望能够为超市运输货物。这可是一比大买卖呀command当然是很高兴。大家一拍即合。一开始合作的也很愉快但是过了几天出现了一点小问题。【DataTable的缺点】超市的老板找到了command“你们的集装箱确实挺好但是有一个小问题呀。他们的样子都是一模一样的只能通过外面的标签来区分里面的货物这个太不方便了而且还容易出错昨天本来想运一批‘微波炉’结果标签写错了写成了‘光波炉’。幸好发现的及时否则就赔大发了。你们能不能想个好点的办法呢”。command心想“你们把标签写错了和我有什么关系呢”不过客户就是上帝呀得罪不起还得想个办法解决一下。于是又把大家都召集过来一起商议。只是这次并没有上次那么顺利想了不少办法但是都不理想。正在一筹莫展的时候面向对象公司的推销员来了。【实体类来了】面向对象的推销员知道了这个问题后笑了来生意了呀哈。“这个正是我们的优势呀相对于集装箱DataTable的容易出错这个缺点我们推出来‘实体类’这种新型的集装箱是根据不同的货物量身定做的微波炉的实体类只能装微波炉光波炉的实体类只能装光波炉冰箱的实体类只能装冰箱……而且他们的外形也和独特一眼就能看出来很好区分。”Command一听这个好哇正愁这件事情呢太好了。“我们正在和一家大型超市合作他们的货物有很多的种类每一类都定制一个实体类这样不就不会出错了吗哈哈。快把超市老板找来一起商议一下。”【不仅实体类来了还带来了一批专门的装卸工人】但是事实和理想总是有那么一点差距。以前用集装箱DataTable的时候结构是一样的DataAdapter只需要一种工人就可以完成装卸的工作但是采用实体类之后就必须按照实体类的各自的特点来找人。能够给冰箱实体类装货物的工人不能给电视实体类装货物因为两种实体类的结构是不一样的。同理也不能给其他实体类装卸货物。这样就需要很多工人一批工人专门装卸冰箱实体类另一批工人专门装卸电视实体类……。问题还不只这些一开始超市大量提取CRT显示器但是过了一段时间基本不提取CRT显示器的因为被液晶显示器代替了。Command本来想去掉CRT的实体类和其装运工人但是超市说了虽然现在不怎么卖CRT了但是还是有需求的呀。你裁掉了下个月想运CRT显示器怎么办呀这样成本就又上来了。而且很可能养着一批工人但是他们又没什么事情可干。Command愁坏了想要改回集装箱但是客户又不同意实体类很好用呀你怎么可以改回不好用的集装箱呢这可怎么办成本居高不下快赔死了。【“反射”登场了】这时候又来了一个推销员。怎么推销员这么多呢这次是反射公司的推销员他带来了一个叫做“反射”的东东用了这个就不怕不同类型的实体类了因为用了反射同一批工人就可以给不同类型的实体类赋值了不在需要向以前那样不同的实体类需要不同的工人了。太好了这样就不需要那么多不同类型的工人了成本又可以降低下来了。故事就先到这里吧再往下就应该说一说反射的效率问题了但是这方面我还没有做过测试理论上更是不清楚。所以就先不说了。这个只能算是故事梗概吧读起来很是干干巴巴的没什么味道。俺语文没学好文笔很差。这里表达的重点有两个。一个是Connection和连接池的关系Connection、Command、DataReader、DataAdapter他们的关系。我把Command看成了一个大的容器在故事里是一个物流公司其他的是下属部门或者是合作伙伴。另一个是DataTable和实体类。只是这一点说得并不是很详细他们的优缺点说得也不多。
重温数据库访问
发布时间:2026/5/25 15:17:00
本文想借用故事的方式来说一下ADO.net的工作方式。虽然现在都ORM了但是了解一下ADO.net还是有必要的。在茫茫的大海上有许多的岛其中一个岛的名字叫做“应用程序岛”。这座岛上商业非常发达高楼大厦、店铺林立。但是岛的面积不够大没有地方建立仓库。所以市长决定把临近的一座小岛开发出来专门作为数据仓库来使用这座岛的名字就叫“数据库岛”。市长在数据库岛上面建立了一个MSSQL数据库这样各个商场、超市就可以把自己的货物放进去了。两个岛相邻很近为了便于运输所以直接在两个岛之间建立了五座大桥。并且成了一个“数据访问池”的部门来专门管理这五座桥。有一个叫command的家伙很聪明觉得商机来了于是他就成立了一家Command物流公司专门负责两座岛之间的货物运输。物流公司成立了几个下属部门Connection、DataReader。Connection负责与连接池的联系申请大桥的临时使用权并且还要提供车辆。DataReader负责装卸货物。好了万事具备只欠东风。物流公司成了好了之后就坐等客户上门了。不久来了一位客户是岛上的一个书店他们购进了一批图书需要送到数据库岛的仓库里。【添加记录的情况】Command接到了这个任务很高兴终于开张了。领导当然不能自己亲自去干活了于是派出了明星员工cm007来负责这个任务。SqlCommand cm007 new SqlCommand();Cm007从书店那里得到了指令就是SQL语句和货物来到Connection部门。cm007.CommandText ;Connection部门派出了得力员工cn007SqlConnection cn007 new SqlConnection();cm007.Connection cn007;cn007开着车带着cm007来到了大桥由cn007和连接池联系想要申请一座大桥的临时使用权。cn007.Open();连接池得到了这个申请之后查看了一下大桥的使用情况现在五座大桥都没有人使用于是把001号大桥的使用权交给了cn007。这个时候这座001号大桥就由cm007他们独占了其他任何人都不可以使用。而且是按照独占时间来收取费用的。一行人通过001号大桥来到了数据库cm007把指令交给了数据库管理员开始交货。数据库管理员按照指令把货物放到了指定的位置。办好之后cm007带着数据库的确认证明从大桥返回到了应用程序岛。离开大桥后cn007又给连接池发了一个申请。cn007.Close();连接池得到了这个申请后收回了001号大桥的使用权这样其他人就又可以使用这个大桥了。cm007一行人来到了书店把数据库管理员的证明交给了书店客户很满意这个任务也就完成了。回到物流公司交差。cn007.Dispose();cm007.Dispose();command很高兴首战告捷以后的生意一定会很红火呀。【提取查询记录向上层直接返回DataReader的情况】第二天那家书店又来找command要从数据库岛提五本书过来。又来生意了太好了于是又派出了cm007和cn007。不过这次和昨天不太一样昨天是送货到仓库今天是从仓库提货。这次还需要DataReader派装卸工来配合。轻车熟路cn007开着车带着大家来到了大桥cn007申请了一座大桥的使用权来到了数据库岛cm007把指令交给了数据库管理员开始提货。不过这次却遇到了一点小问题运输车的运载量的太小了一次只能运一本书一条记录。可是这次却需要提五本书五条记录没办法只好多跑几趟了。带上一本书一条记录来到了书店书店老板很高兴这么快就到了呀赶快卸货上架吧。咦等等怎么只有一本书呀。Cm007只好解释我们的车运载量太小了一次只能运一条记录不过速度还是很快的呀。书店老板想了想也凑合了那你们赶快运下一条记录吧。如是这般折腾了五趟总算把货物全都运完了。“等等”cn007说“大桥的使用权还没有交回去呢。”于是大家又来到了桥头把使用权交了回去。最后回到物流公司交差。【改进向上层返回DataTable】这回command可高兴不起来了。大桥是按照占用时间来收费的这么来回折腾大桥的占用时间明显变长了这就增加了成本呀。另外现在汽油这么贵来回折腾烧的可都是钱呀就不能跑一趟多运点吗于是command把大家召集过来一起商量这个事情。cn007说大桥这一段没有什么办法可想了一次只能运出来一条记录这个也不知道是谁规定的我们也改不了。不过从桥头到客户那里我们倒是可以想想办法我有一个朋友DataAdapter他们也许会有办法。Command听了也没有什么其他的方法那就把DataAdapter请过来一起商量一下吧。第二天DataAdapter过来了也带来了他的解决方案。其实也很简单他们公司可以提供集装箱就是DataTable在桥头等待货物运到的时候由DataReader装到集装箱里然后立刻返回运第二批货物。等需要的货物全都装完了之后在开着集装箱运到客户那里。SqlDataAdapter da007 new SqlDataAdapter();DataTable dt007 new DataTable();da007.Fill(dt007);这样就节省了大桥的占用时间节省了成本。到客户的这段路程集装箱跑一趟就可以了省油。这个方案不错command欣然接受。过了几天书店又要提一批图书这次采用了集装箱的方案果然大大节省了成本客户也很满意虽然一开始要等待比较长的时间但是好在一次性就可以得到全部的货物。【多种返回类型DataRow、object[]、object】有一天又发现了一个新问题书店只要一本书。就一本书也弄一个集装箱太浪费了吧。怎么办干脆直接用DataRow吧。实在不行用object[]。对于一条记录也足够用了。【实体类开始登场】于是物流公司的生意是越来越红火了。有一家大型超市也找到了command希望能够为超市运输货物。这可是一比大买卖呀command当然是很高兴。大家一拍即合。一开始合作的也很愉快但是过了几天出现了一点小问题。【DataTable的缺点】超市的老板找到了command“你们的集装箱确实挺好但是有一个小问题呀。他们的样子都是一模一样的只能通过外面的标签来区分里面的货物这个太不方便了而且还容易出错昨天本来想运一批‘微波炉’结果标签写错了写成了‘光波炉’。幸好发现的及时否则就赔大发了。你们能不能想个好点的办法呢”。command心想“你们把标签写错了和我有什么关系呢”不过客户就是上帝呀得罪不起还得想个办法解决一下。于是又把大家都召集过来一起商议。只是这次并没有上次那么顺利想了不少办法但是都不理想。正在一筹莫展的时候面向对象公司的推销员来了。【实体类来了】面向对象的推销员知道了这个问题后笑了来生意了呀哈。“这个正是我们的优势呀相对于集装箱DataTable的容易出错这个缺点我们推出来‘实体类’这种新型的集装箱是根据不同的货物量身定做的微波炉的实体类只能装微波炉光波炉的实体类只能装光波炉冰箱的实体类只能装冰箱……而且他们的外形也和独特一眼就能看出来很好区分。”Command一听这个好哇正愁这件事情呢太好了。“我们正在和一家大型超市合作他们的货物有很多的种类每一类都定制一个实体类这样不就不会出错了吗哈哈。快把超市老板找来一起商议一下。”【不仅实体类来了还带来了一批专门的装卸工人】但是事实和理想总是有那么一点差距。以前用集装箱DataTable的时候结构是一样的DataAdapter只需要一种工人就可以完成装卸的工作但是采用实体类之后就必须按照实体类的各自的特点来找人。能够给冰箱实体类装货物的工人不能给电视实体类装货物因为两种实体类的结构是不一样的。同理也不能给其他实体类装卸货物。这样就需要很多工人一批工人专门装卸冰箱实体类另一批工人专门装卸电视实体类……。问题还不只这些一开始超市大量提取CRT显示器但是过了一段时间基本不提取CRT显示器的因为被液晶显示器代替了。Command本来想去掉CRT的实体类和其装运工人但是超市说了虽然现在不怎么卖CRT了但是还是有需求的呀。你裁掉了下个月想运CRT显示器怎么办呀这样成本就又上来了。而且很可能养着一批工人但是他们又没什么事情可干。Command愁坏了想要改回集装箱但是客户又不同意实体类很好用呀你怎么可以改回不好用的集装箱呢这可怎么办成本居高不下快赔死了。【“反射”登场了】这时候又来了一个推销员。怎么推销员这么多呢这次是反射公司的推销员他带来了一个叫做“反射”的东东用了这个就不怕不同类型的实体类了因为用了反射同一批工人就可以给不同类型的实体类赋值了不在需要向以前那样不同的实体类需要不同的工人了。太好了这样就不需要那么多不同类型的工人了成本又可以降低下来了。故事就先到这里吧再往下就应该说一说反射的效率问题了但是这方面我还没有做过测试理论上更是不清楚。所以就先不说了。这个只能算是故事梗概吧读起来很是干干巴巴的没什么味道。俺语文没学好文笔很差。这里表达的重点有两个。一个是Connection和连接池的关系Connection、Command、DataReader、DataAdapter他们的关系。我把Command看成了一个大的容器在故事里是一个物流公司其他的是下属部门或者是合作伙伴。另一个是DataTable和实体类。只是这一点说得并不是很详细他们的优缺点说得也不多。