CodeSmith_NetTiers快速开发(2)
首先非常抱歉, 隔了这么久才更新第二弹, 本当にすまなかった。
是因为最近在搞JavaScript, 脑袋都大了, 后面还会写个关于搞了一周才搞出来的小小成果(类似51job选择职能类别的那种弹出层)
好, 下面进入正题吧!
上次我们讨论了如何使用.netTiers整出来一个程序, 其实鸟文好的朋友会比我整地更牛, 呵呵. 这次我们接着上次的成果来继续.
编译利用.netTiers整出来的那个解决方案. 在解决方案的目录下有个XX.WebSite的目录, 里面有个叫Bin的目录, 我们发现这里有一堆类库文件, 一会儿就能用到.
再来我们关闭刚刚编译的那个解决方案, 新建一个自己的解决方案. 在其中如下建立类库工程和Web项目. (传说业务逻辑应该叫做BusinessLogic, 算了, 随便你起个啥名啦. ) 当然, 我们这只是个最简单不过的例子, 所以只建了这么两个项目, 如果你还需要用写自己的公共类库或者还要有除了跟数据表关联的实体之外其他的实体再或者你还想有自己的Web控件之类的都自己再添加, 我们这里就先这样. (又整一堆没用地…)
首先我们先在两个项目中引用上面提到的那一堆动态链接库文件. (别忘了让WebUI去引用Services啊, 呵呵!)
然后修改位于WebUI下的web.config文件, 具体修改内容如下:
1. 在configSections节点下添加:
<section name="TestWebDataBase.DataAccess" type="TestWebDataBase.DataAccess.Bases.NetTiersServiceSection, TestWebDataBase.DataAccess" allowDefinition="MachineToApplication" restartOnExternalChanges="true" />
<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
2. 替换<connectionStrings /> 为:
<connectionStrings>
<add name="TestWebDataBase.DataAccess.ConnectionString" connectionString="Data Source=xx.xx.xx.xx;Initial Catalog=TestWebDataBase;Persist Security Info=True;User ID=xx;Password=xx" />
</connectionStrings>
<TestWebDataBase.DataAccess defaultProvider="SqlNetTiersProvider">
<providers>
<!--
*** SqlClient Provider ***
connectionStringName: sqlclient connection string to the db
useStoredProcedure: if true, indicates that we use the stored procedures, otherwise, we use parametrized queries that are embedded.
-->
<add
name="SqlNetTiersProvider"
type="TestWebDataBase.DataAccess.SqlClient.SqlNetTiersProvider, TestWebDataBase.DataAccess.SqlClient"
connectionStringName="TestWebDataBase.DataAccess.ConnectionString"
providerInvariantName="System.Data.SqlClient"
entityFactoryType="TestWebDataBase.Entities.EntityFactory"
useEntityFactory="true"
enableEntityTracking="true"
enableMethodAuthorization="false"
useStoredProcedure="false"
defaultCommandTimeout="30"
/>
<!--
*** WebserviceClient Provider ***
The url parameter indicates the webservices url (ex: http://localhost/TestWebDataBase/TestWebDataBaseServices.aspx)
<add
name="WsNetTiersProvider"
type="TestWebDataBase.DataAccess.WebServiceClient.WsNetTiersProvider, TestWebDataBase.DataAccess.WebServiceClient"
url="/TestWebDataBaseServices.asmx" />
-->
</providers>
</TestWebDataBase.DataAccess>
<enterpriseLibrary.ConfigurationSource selectedSource="File Configuration Source">
<sources>
<add name="File Configuration Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
filePath="entlib.config" />
</sources>
</enterpriseLibrary.ConfigurationSource>
好, 到此为止我们就设置完web.config了.接下来为了在页面上查询出数据并显示, 我们在Services项目中建个类, 我就给它起名叫” UserLogic”(在写此文时我用的数据库中有个叫做Users的表), 别忘了要using TestWebDataBase.Services;和using TestWebDataBase.Entities; (TestWebDataBase是用CodeSmith生成那个主命名空间)然后我们的这个UserLogic类还要继承于: UsersServiceBase (就是表名+ServiceBase), 这是为了我们能简单的使用.netTiers为我们提供好的数据查询方法.然后我们随便写一个方法, 让这个方法为我们返回数据库中Users表中的所有数据. 代码如下:
public TList<Users> GetAllUsers()
{
return this.GetAll();
}
(“啊? 这就完了? 哇靠! 上坟烧报纸, 你糊弄鬼那?!” 西红柿, 鸡蛋……)
(擦擦脸. (头发上还有方便面…))
对, 就是这么简单, .netTiers已经都为我们做好了, 我们在做完前期工作之后, 就可以如此简单的对数据库进行访问.
注意, 返回的是一个泛型集合(TList), 这是我们可以在CodeSmith中设置的一个变量, 它代表我们的实体类(表)的数据可以被枚举出来, 如果是试图, 这个泛型名称就会成为(VList).
不管是啥啦, 总之我们获得了一个集合, 试试看吧, 在WebUI中建立一个asp.net页面, 放个Button再整个GridView啥的, 把这个返回的集合直接给到GridView的DataSource中. 运行后, 我们发现, 数据表中的数据都出来了.
我们再来看一个方法:
public TList<Users> GetAllUsers()
{
TList<Users> lUsers = new TList<Users>();
lUsers.Add(GetByUserId("1"));
return lUsers;
}
这里我们用到了另一个功能, 根据表的主键获得整列数据, 就是GetByUserId 方法.
下面我们加点条件查一下:
public TList<Users> GetAllUsers()
{
TList<Users> lUsers = new TList<Users>();
UsersFilterBuilder usersFilterBuilder = new UsersFilterBuilder();
usersFilterBuilder.Append(UsersColumn.UserId, "1");
int totalCount = 0;
lUsers.AddRange(GetPaged(usersFilterBuilder.ToString(), "", 0, int.MaxValue, out totalCount));
return lUsers;
}
这里我们使用了拼条件的另一个类UsersFilterBuilder, 当然前面的Users还是我们的表名啦, 这个类让我们能够轻松的拼写要查询的条件字符串. (必须引用TestWebDataBase.DataAccess.Bases命名空间, DataAccess就是在CodeSmith中设置的那个数据访问层的命名空间, 后面的Bases是固定的)
使用这个类和使用StringBuilder差不多, 都是往里头塞字符串, 不同的是, 这个类可以根据.netTiers为每一个表或视图生成的枚举列的变量来拼字符串, 上面例子就用到了Users类的列枚举变量: UsersColumn . 其实大家也看出来了, 这次我们查询的结果和上次的一样, 呵呵, 我比较懒, 就没再多弄, 呵呵.
然后我们用到了另一个返回结果集的方法: GetPaged . 这个方法给我们提供了简便的分页方式, 上面我用的是这个方法的三个重载中参数最多的一个, 首先是查询字符串, 然后是排序方式(默认是ASC, 还可以是DESC), 在来是开始的行号, 然后是每页的数据条数, 最后是方法为我们返回的结果集总数.
OK, 关于查询就先到此为止, 更深入的研究还靠大家多努力, 这文章就是开个头而已.
接下来我们看看插入吧.
要想插入我们就得先建立一个要插入的实体, 这点跟LinqToSQL差不多, 不过调用插入方法貌似简单了几句.
啥也不说啦, 看代码直接一点:
public void InsertUser(String strUserId, String strPassword, String strType)
{
Users user = new Users { UserId = strUserId, UserPassword = strPassword, UserType = strType };
//Users user = Users.CreateUsers(strUserId, strPassword, strType);
this.Save(user);
}
当然, 上面代码还是放到我们的UserLogic类当中的.
这里我注释掉了一句, 就是为了说明.netTiers也为我们提供了新建实体类的方法(好像构造器, 但是这实体类中包含的内容过多, 怕我们找的费劲, 所以弄了个只有表中列为参数的这么个方法). 当然, 没注释的那句是C#3.0的特性了, 没用VS2008的朋友就别用那句了. (我还是比较喜欢这个特性的, 好方便啊~~~)
*我这个表就这么三列, 所以…
新建实体之后, 调用Save(实体)这个方法就完事了, 简单吧~~~o(∩_∩)o…哈哈.
接下来我们看看修改吧.
既然是修改, 那就得先从数据库中获取要修改的东西, 让我们一顿改之后在扔回数据库中去.
就抱着这个思想我们来写一下代码:
public void UpdateUser()
{
Users user = GetByUserId("a");
user.UserId = "admin";
user.UserPassword = "admin";
user.UserType = "1";
this.Update(user);
}
首先利用查询来获得要修改的那条记录, 然后修改, 最后调用Update(实体)方法来实现提交.也很简单吧, 一看就会了, 你真聪明~~~(这个方法挺猛的, 连主键都能改…)
Update方法的另一个重载是可以一次修改多条, 只要给它一个TList泛型的参数就哦了.
好, 然后轮到删除了.
public void DeleteUser()
{
Users user = GetByUserId("a");
this.Delete(user);
//this.Delete("a");
}
一看就明白了吧, o(∩_∩)o…哈哈, 真简单~~そんな易いだろう~
Delete有4个重载, 感觉比较常用的就是我上面代码中写的两种, 一种是将要删的实体作为参数, 另一种是将主键做参数.
增, 删, 改, 查 都完事了, 可以结合起来用了, 一次处理多个任务, 比如先删除, 再修改, 再来个增加, 这么多东西放一起了, 不来个事务好像也不是那么回事吧, 呵呵.
下面就看看看事务.
public void TestTransaction()
{
TransactionManager tm = null;
try
{
tm = ConnectionScope.CreateTransaction();
Users userA = GetByUserId("a");
this.Delete(userA);
Users userB = GetByUserId("b");
userB.UserId = userB.UserId.ToUpper();
userB.UserPassword = "123456";
userB.UserType = "admin";
this.Update(userB);
Users userC = new Users { UserId = "c", UserPassword = "c", UserType = "c" };
this.Save(userC);
if (null != tm && tm.IsOpen)
{
tm.Commit();
}
}
catch (Exception e)
{
if (null != tm && tm.IsOpen)
{
tm.Rollback();
}
}
}
要使用这里的事务, 也就是TransactionManager类我们必须引用TestWebDataBase.DataAccess命名空间. 好, 看看代码大家就又都明白了, 和以前用事务时的唯一区别就是创建和开始事务少了几句话, 呵呵.
ConnectionScope类是在TestWebDataBase.Services命名空间里的, 有创建和开始事务的功能. 很简单吧, 提交事务还是Commit, 回滚也还是Rollback.
OK, 到此为止.netTiers的基本应用就完事了, 其实.netTiers给我们提供了好些有用的方法, 还等待大家来慢慢摸索, 还是那句话, 这文只是开个头而已, 对于初学者可能有那么点用处, o(∩_∩)o…
各位大虾, 小的有说的不对的地方请不吝指摘啊! 大家一起学习一起进步.
/*-- 完 --*/
转载于:https://www.cnblogs.com/tonykent/archive/2008/12/08/1349989.html