Subsonic 3.0 的使用
1.添加引用文件
subsonic.dll
2.添加配置文件web.config
<connectionStrings>
<add name="PrepaidCardCon" connectionString="Server=192.168.3.100;initial catalog=CTU_PrepaidCard;User=zouxuechangdata;Pwd=dk30wkdl238"/>
</connectionStrings>
3. 使用ActiveRecord
针对您的数据和数据库ActiveRecord的是最简单,最容易的方法。该模式是,每个实例对应的是一个数据库中的数据行,这意味着每个对象类型可以被认为是你的数据库表。
许多开发人员不喜欢与他们的数据库紧耦合工作,但其他人认为这是非常理想方式,消除了与数据库抽象工作有利于面向对象的“阻抗不匹配”。
SubSonic的ActiveRecord是给你需要的,然后自己决定如何做。你会发现你有能力使用LINQ是如此易用的代码,快速和简单的依据数据库生成代码。
3.1设置模板连接
T4模板创造类文件,需要知道连接字符串。要设置:打开文件名为“Settings.ttinclude”,在@ import语句下面,您会看到三个设置,如下:
const string Namespace = "Northwind.Data";
const string ConnectionStringName = "Northwind";
const string DatabaseName = "Northwind";
主要设置是“ConnectionStringName”, 这告诉SubSonic的使用的哪个数据库连接。Namespace常量用来SubSonic生成代码的命名空间。 注意包含的所有*.tt文件需要匹配您的数据库,如下:
//其他文件: MySQL.ttinclude, SQLite.ttinclude
<#@ include file="SQLServer.ttinclude" #>
3.2项目中增加T4模板
上述设置完成后,只要将T4模板拖入到您的项目。因为Visual Studio 2008中看到一个“*.tt”文件,它会自动执行它。所以你不必做任何事情,只需要运行程序。
文件列表如下:
2 ActiveRecord.tt
2 Context.tt
2 Settings.ttinclude
2 SQLServer.ttinclude OR MySQL.ttinclude OR SQLite.ttinclude
2 StoredProcedures.tt (可选项,如果执行存储过程需要添加此文件)
2 Structs.tt
如果更改了数据库,只需右键单击ActiveRecord.tt,Context.tt和Structs.tt文件并选择“运行自定义工具”,将会自动执行它们。
3.3查询
使用ActiveRecord的查询非常方便,下面是单元测试的一些例子:
//差钱ID=1的默认单条记录
var product = Product.SingleOrDefault(x => x.ProductID == 1);
//查询ProductID <= 10的记录
var products = Product.Find(x => x.ProductID <= 10);
//获取服务器端的分页列表
var products = Product.GetPaged(0,10);
//使用Linq查询
var products = from p in Product.All()
join od in OrderDetail.All() on p.ProductID equals od.ProductID
select p;
从上面的代码可以中注意与SubSonic2.0的一些不同。
Subsonic语句操作方法:
一、查询
1)简单查询
一种方式(分解构造式)
SubSonic.Queryquery = TPjWorkday.CreateQuery();
query.SelectList = TPjWorkday.Columns.Year+ ", " + TPjWorkday.Columns.Yearmonth + "," + TPjWorkday.Columns.Workdays;
query.AddWhere(TPjWorkday.Columns.Year,yearNum);
query.OrderBy = SubSonic.OrderBy.Asc(TPjWorkday.Columns.Yearmonth);
DataTabledt = query.ExecuteDataSet().Tables[0];
returndt;
另外一种方式(LINQ式)
SqlQuery query= newSelect(TPjWorkday.Columns.Year, TPjWorkday.Columns.Yearmonth, TPjWorkday.Columns.Workdays).From(TPjWorkday.Schema
).Where(TPjWorkday.Columns.Year).IsEqualTo(yearNum).OrderAsc(TPjWorkday.Columns.Yearmonth);
DataTabledt = query.ExecuteDataSet().Tables[0];
2)LIKE查询
queryBuilder.AddWhere(TBaseAddressbook.Columns.Name, Comparison.Like,"%"+this.tbName.Text+"%");
3)查询单值
SqlQuery query = newSelect(TBaseDepartment.Columns.Deptname).From(TBaseDepartment.Schema
).Where(TBaseDepartment.Columns.Deptid).IsEqualTo(deptid);
return query.ExecuteScalar().ToString();
4)多表连接查询(连接查询的表的数量超过3个最好使用视图)
根据单位ID获取用户
SqlQuery query=newSelect(TBaseUser.UseridColumn,TBaseUser.UsernameColumn, TBaseUser.PersonnameColumn, TBaseUser.PhonecodeColumn, TBaseUser.EmailColumn)
.From(TBaseUser.Schema).InnerJoin(TLstUserindepartment.UseridColumn, TBaseUser.UseridColumn)
.Where(TBaseUser.EnabledColumn).IsEqualTo(1)
.And(TLstUserindepartment.DeptidColumn).IsEqualTo(deptid)
.OrderAsc(TBaseUser.Columns.Userid);
DataTabledt = query.ExecuteDataSet().Tables[0];
注意InnerJoin(f2,f1)的用法。也就是说当两个表连接时,From语句里面的表要放在后面。
5)分页查询
(方式一,Query)
//Query方式分页,序号列使用rowindex, oracle数据库
Query query1 = newQuery(TBaseUser.Schema);
query1.SelectList = TBaseUser.Columns.Userid+ "," + TBaseUser.Columns.Personname + ","+ TBaseUser.Columns.Phonecode+","+ TBaseUser.Columns.Email + ","+ TBaseUser.Columns.Userindex;
query1.AddWhere(TBaseUser.Columns.Issignedin,Comparison.Equals, 1);//登录状态
query1.AND(TBaseUser.Columns.Enabled,Comparison.Equals, 1);//启用
query1.OrderBy = OrderBy.Asc(TBaseUser.Columns.Userindex);
int sum= query1.ExecuteDataSet().Tables[0].Rows.Count;//用于计算总页数
query1.PageSize = 12;//分页大小
query1.PageIndex = pagenum -1;//当前页
DataTableViewData = query1.ExecuteDataSet().Tables[0];
if(sum%12==0)
this.lbPageCount.Text= (sum / 12).ToString();
else
this.lbPageCount.Text= (sum / 12+1).ToString();
this.lbPageNum.Text= pagenum.ToString();
(方式二、SqlQuery)
//SqlQuery方式分页,序号列使用row_number oracle数据库
SqlQuery query = newSelect().From(VWfSupervisor.Schema).Where(VWfSupervisor.Columns.Userid).IsEqualTo(CreateUserInfo().userid).OrderAsc(VWfSupervisor.Columns.Userid);
int sum = query.ExecuteDataSet().Tables[0].Rows.Count;//未分页前,总记录数
query.Paged(pagenum - 1, 12);
DataTable ViewData = query.ExecuteDataSet().Tables[0];
if(sum%12==0)
this.lbPageCount.Text= (sum / 12).ToString();
else
this.lbPageCount.Text= (sum / 12+1).ToString();
this.lbPageNum.Text= pagenum.ToString();
二、插入,更新和删除
插入和更新操作都是通过实体的Save()方法来实现的,判断更新与插入操作主要体现在实体的IsNew属性,如果IsNew==true,则执行的是插入操作,反之执行的是更新操作。
当实例化一个实体时,如TPjWorkday newworkday = newTPjWorkday(),此时的newworkday.IsNew=true;
当实例化传入参数时,
TPjAttendancetime attendanceTime = newTPjAttendancetime(Convert.ToInt32(dt.Rows[0]["flowid"]));此时的newworkday.IsNew=false。
1.插入
TPjWorkday newworkday = newTPjWorkday();
newworkday.Year = Convert.ToInt32(lbYear.Text);
newworkday.Yearmonth= Convert.ToInt32(this.lbYear.Text)* 100 + (i + 1);
newworkday.Workdays = workStr;
newworkday.Save();
newInsert(TLstUserinrole.Schema,false).Value(TLstUserinrole.UseridColumn,2).Value(TLstUserinrole.RoleidColumn, 2)
.Value(TLstUserinrole.CreatebyColumn,3).Value(TLstUserinrole.CreatetimeColumn, DateTime.Now).Execute();
其中false表示不是全部字段。默认为true
2.更新
单字段逐渐更新方式,传入主键字段值
TPjAttendancetime attendanceTime = newTPjAttendancetime(Convert.ToInt32(dt.Rows[0]["flowid"]));
attendanceTime.Begintime = Convert.ToDateTime(tbBeginTime.Value);
attendanceTime.Endtime = Convert.ToDateTime(tbEndTime.Value);
attendanceTime.AM1 = Convert.ToDateTime(dlAm1.SelectedValue).ToShortTimeString();
attendanceTime.AM2 = Convert.ToDateTime(dlAm2.SelectedValue).ToShortTimeString();
attendanceTime.PM1 = Convert.ToDateTime(dlPm1.SelectedValue).ToShortTimeString();
attendanceTime.PM2 = Convert.ToDateTime(dlPm2.SelectedValue).ToShortTimeString();
attendanceTime.Modifyby = Convert.ToInt32(Request.QueryString["userid"]);
attendanceTime.Modifytime = System.DateTime.Now;
attendanceTime.Save();
newUpdate(TPjInnernews.Schema).Set(TPjInnernews.NewstitleColumn).EqualTo("123").Where(TPjInnernews.NewsidColumn).IsEqualTo(3);
复合主键更新方式,(userid,ascxid)
newUpdate(TLstUserhomepage.Schema).Set(TLstUserhomepage.Columns.Modifytime).EqualTo(System.DateTime.Now).Set(TLstUserhomepage.Columns.Modifyby).EqualTo(3).Where(TLstUserhomepage.UseridColumn)
.IsEqualTo(409).And(TLstUserhomepage.AscxidColumn).IsEqualTo(11).Execute();
//修改记录, 先取得对象,然后再更新
TBaseStatistictype=newSelect().From(TBaseStatistic.Schema).Where(TBaseStatistic.Columns.Typeid).IsEqualTo(int.Parse(GetEQString("Typeid")))
.And(TBaseStatistic.Columns.Statid).IsEqualTo(int.Parse(this.Label3.Text)).ExecuteScalar();
type.Statname = this.TextBox1.Text.Trim();
type.Stattabname = this.Label1.Text;
type.Statcolname = this.Label12.Text;
type.Statcolid = this.Label7.Text;
type.Datecolname= this.Label14.Text;
type.Wherepart= this.Label8.Text;
type.Save();
UPDATE table set column=column+1
int records = newUpdate(Product.Schema)
.SetExpression("UnitPrice").EqualTo("UnitPrice * 3")
.Where("productid").IsEqualTo(1)
.Execute();
3.删除
Query q = TPjWorkday.CreateQuery();
q.WHERE(TPjWorkday.Columns.Year, Convert.ToInt32(lbYear.Text));
q.QueryType = QueryType.Delete;
q.Execute();
TPjWorkday.Delete(TPjWorkday.Columns.Yearmonth, "200901");
三、事务处理
using (SharedDbConnectionScopesp = newSharedDbConnectionScope())
{
using (TransactionScopescope = newTransactionScope())
{
//数据库操作
// 不能使用平台的自增操作,否则会报错:
{"无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自HRESULT:0x8007007E)。"}
//CACA.BusinessLogic.Util.CounterUtil.increment("EntityInnernews")
scope.Complete();
}
}
List<SqlQuery>list = newList<SqlQuery>();
list.Add(newDelete().From(TBaseAddressbook.Schema).Where(TBaseAddressbook.Columns.Serialno).IsEqualTo(lbl.Text));
list.Add(newDelete().From(TBaseAddressbookusual.Schema).Where(TBaseAddressbookusual.Columns.Serialno).IsEqualTo(lbl.Text));
SqlQuery.ExecuteTransaction(list);
List<Insert>list=new List<Insert>();
存储过程:
//StoredProcedure spd = newStoredProcedure("GetDataTable");
//spd.Command.AddParameter("@userid",userid);
//spd.Command.AddOutputParameter("@dataresult");
//spd.Execute();
四、SubSonic直接执行SQL语句(后门,当遇到无法解决的问题时,直接写SQL语句)
SubSonic直接执行SQL语句可以使用以下方式:
//执行sql语句,返回datatable
QueryCommand qc = newQueryCommand(strSql.ToString(), null);
dt =DataService.GetDataSet(qc).Tables[0];
public void Inline_Simple()
{
QueryCommandcmd = new InlineQuery().GetCommand("SELECT productID from products");
Assert.IsTrue(cmd.CommandSql==
"SELECT productID fromproducts");
}
public void Inline_WithCommands()
{
QueryCommandcmd = new InlineQuery()
.GetCommand(@"SELECTproductID from products
WHEREproductid=@productid", 1);
Assert.IsTrue(cmd.Parameters[0].ParameterName== "@productid");
Assert.IsTrue((int)cmd.Parameters[0].ParameterValue== 1);
}
public void Inline_AsCollection()
{
ProductCollectionproducts =
newInlineQuery()
.ExecuteAsCollection<ProductCollection>(
@"SELECTproductID from products
WHEREproductid=@productid", 1);
}
五、常用方法的返回值
Execute(),返回受影响的记录条数
//ExecuteScalar(),返回一个object,(System.Decimal类型的值)
ExecuteSingle<T>(),返回T类型的对象,例如可以用这个方法获得满足要求的实体对象。
TDicItem item= newSelect().From(TDicItem.Schema).Where(TDicItem.Columns.Dicitemid).IsEqualTo(2)
.And(TDicItem.Columns.Dictypeid).IsEqualTo(1030).ExecuteSingle<TDicItem>();
ExecuteDataSet(),返回一个记录集DataSet
ExecuteTypedList<T>();返回List<T>,对象的列表,例如
List<Product>products = new Select().From<Product>()
.Where(Product.ProductIDColumn).IsEqualTo(4)
.Paged(1, 30)
.ExecuteTypedList<Product>();

浙公网安备 33010602011771号