一直在想怎么样才能让dbHelper更简单,更灵活,更僵化。终于我发布了第一个开源版本的dbhelper.此helper将使用System.Data.DbHelper作为命名空间。采用内部驱动与内容Session的方式来进行管理。而作为使用者,你只需要作两件事情。1、注册一个驱动;2、继承Dal创建自己的数据处理层。Dbhelper在进行事务操作时需要使用Lock来开启事务;Unlock提交事务。当出错时自动进行事务回滚(获立事务的Dal除外)。多个Dal可以通过Group()方法将事务进行统一(即使驱动不同)。若存在多层嵌套关系,且每个Dal都有Lock,那么事务以最外层的为准。
调用方法很简单
1、注册驱动
DbService.Instance.RegistDriver(
"
sql
"
, config.Sql,
typeof
(SqlHelper));
DbService.Instance.RegistDriver(
"
oracle
"
, config.Oracle,
typeof
(MsOracleHelper));
2、普通查询
public
DataTable GetSource(DateTime time)
{
var
sql =
new
StringBuilder()
.Append(
"
select checktime,sn_name,badgenumber
"
)
.Append(
"
FROM checkinout c
"
)
.Append(
"
LEFT join userinfo u
"
)
.Append(
"
ON c.userid = u.userid
"
)
.AppendFormat(
"
WHERE CONVERT(VARCHAR(10),c.checktime,23)= '{0}'
"
, time.ToString(
"
yyyy-MM-dd
"
));
CommandText
=
sql.ToString();
return
GetDataTable();
}
3、参数化提交
public
bool
SyncCardPress(DataTable source,DateTime time)
{
if
(source ==
null
|| source.Rows.Count ==
0
)
return
true
;
Lock();
var
d = time.ToString(
"
yyyy-MM-dd
"
);
CommandText
=
string
.Format(
"
delete FROM TB_ROLL_RECORD r WHERE to_char(r.presstime,'yyyy-mm-dd') = '{0}'
"
,d);
ExecuteNonQuery();
CommandText
=
"
INSERT INTO TB_ROLL_RECORD VALUES(:userId,:machine,to_date(:pressTime,'yyyy-mm-dd hh24:mi:ss'),sysdate)
"
;
var
userId = AddParameter<OracleParameter>(
"
userid
"
);
var
machine = AddParameter<OracleParameter>(
"
machine
"
);
var
presstime = AddParameter<OracleParameter>(
"
pressTime
"
);
foreach
(DataRow row
in
source.Rows)
{
userId.SetValue(row.To
<
string
>(
"
badgenumber
"
).TrimStart(
'
0
'
).PadLeft(
4
,
'
0
'
));
machine.SetValue(row.To
<
string
>(
"
sn_name
"
));
presstime.SetValue(row.To
<DateTime>(
"
checktime
"
).ToDateTimeString());
ExecuteNonQuery();
if
(!
Success)
{
Debug.WriteLine(Error.Message);
break
;
}
}
UnLock();
return
Success;
}
4、使用存储过程
public
void
Calc(DateTime time)
{
CommandText
=
"
CalcAttendanceByDay
"
;
CommandType
=
CommandType.StoredProcedure;
AddParameter
<OracleParameter>(
"
xType
"
).SetValue(
1
);
AddParameter
<OracleParameter>(
"
xIds
"
).SetValue(
""
);
AddParameter
<OracleParameter>(
"
xDay
"
).SetValue(time.AddDays(-
1
));
AddParameter
<OracleParameter>(
"
xCmt
"
).SetValue(
1
);
Lock();
ExecuteNonQuery();
UnLock();
}
5、说明
发布版本已经去掉对CommanText的直接赋值方法,改为Prepare(.....)来进行
6、哪里有下载 点击这里
好了,祝大家使用愉快。

