问题如下:
1、要开发一个兼容多种数据库(如ACCESS,SQL,ORACLE),看到有些用到了反射,有些用到了IF判断,想问:此种方法会不会影响到读写数据库的总执行时间?
2、还是如果关于多数据库,在三层结构中。数据访问层和中间业务层是不是要各写一个interface?然后根据不同的数据库类型然后实例化
3、在学习过程中。对数据库的操作总是读。改。删,增操作。每一个不同的操作都要写一个方法,不胜其烦。重复的地方很多(大部分只是SQL语句的不同),麻烦看下面代码?有没有什么方法还可以再精简它!!
public class NoteOperate
{
SqlHelper Helper = new SqlHelper();
public NoteOperate()
{
//
// TODO: Add constructor logic here
//
}
/// <summary>
/// 添加留言
/// </summary>
/// <param name="userName"></param>
/// <param name="postTime"></param>
/// <param name="qq"></param>
/// <param name="email"></param>
/// <param name="ip"></param>
/// <param name="agent"></param>
/// <param name="Picture"></param>
/// <param name="content"></param>
/// <param name="hide"></param>
/// <param name="auditNote"></param>
public void InsertNote(string userName,DateTime postTime,string qq,string email,string ip,string agent,string Picture,string content,bool hide,bool auditNote)
{
OleDbParameter[] op ={
new OleDbParameter("@userName",userName),
new OleDbParameter("@postTime",postTime.ToString()),
new OleDbParameter("@qq",qq),
new OleDbParameter("@email",email),
new OleDbParameter("@ip",ip),
new OleDbParameter("@agent",agent),
new OleDbParameter("@picture",Picture),
new OleDbParameter("@content",content),
new OleDbParameter("@hide",hide),
new OleDbParameter("@auditNote",auditNote)
};
string sqlText = "insert into NoteList(userName,postTime,qq,email,ip,agent,picture,content,hide,auditNote) values(@userName,@postTime,@qq,@email,@ip,@agent,@picture,@content,@hide,@auditNote)";
Helper.ExecuteNonQuery(sqlText, op);
}
/// <summary>
/// 根据ID审核留言
/// </summary>
/// <param name="id"></param>
public void AuditNoteById(int id)
{
Helper.ExecuteNonQuery("update NoteList set auditNote='True' where id=" + id);
}
/// <summary>
/// 根据ID删除留言
/// </summary>
/// <param name="id"></param>
public void DeleteNoteById(int id)
{
Helper.ExecuteNonQuery("delete * from NoteList where id=" + id);
}
/// <summary>
/// 根据ID回复留言
/// </summary>
/// <param name="id"></param>
/// <param name="reContent"></param>
/// <param name="reTime"></param>
public void ReContentById(int id,string reContent,DateTime reTime)
{
OleDbParameter[] op ={
new OleDbParameter("@reContent",reContent),
new OleDbParameter("@reTime",reTime.ToString()),
new OleDbParameter("@id",id),
};
string sqlText = "update NoteList set reContent=@reContent,reTime=@reTime where id=@id";
Helper.ExecuteNonQuery(sqlText);
}
}
应该是没太好的方法。
通常都是采用抽象工厂,针对一些抽象类写好接口(例如DbConnection),对不同的数据库都做自己的实现(因为不同数据库对同一个查询实现可能是不同的)。
1、要开发一个兼容多种数据库(如ACCESS,SQL,ORACLE),看到有些用到了反射,有些用到了IF判断,想问:此种方法会不会影响到读写数据库的总执行时间?
我认为:影响的时间很小。
2、还是如果关于多数据库,在三层结构中。数据访问层和中间业务层是不是要各写一个interface?然后根据不同的数据库类型然后实例化
我认为:如果是多数据库当然要为数据访问层写接口,这样方便在BLL中使用抽象工厂方法模式进行方便更改当前使用的DAL.BLL不需要写接口呀。
3、在学习过程中。对数据库的操作总是读。改。删,增操作。每一个不同的操作都要写一个方法,不胜其烦。重复的地方很多(大部分只是SQL语句的不同),麻烦看下面代码?有没有什么方法还可以再精简它!!
我认为:你可以用代码生成器或者ORM框架(NH,LINQ等)可以剩很多CODE.
如果多数库只是ACCESS和SQLSERVER的话,不用写两个DAL的,我已经做过同时支持这两种数据库的DAL(其它没测试过)
部分代码:
Dictionary<String, object> dic = new Dictionary<String, object>();
strSql = "insert into demo(title,contents,addname,adddate,flag) values(@title,@contents,@addname,@adddate,@flag)";
dic.Add("@title", "ptitle");
dic.Add("@contents", "ptitle");
dic.Add("@addname", "pname");
dic.Add("@adddate", DateTime.Now.ToString());//数据库中为"日期/时间"型
dic.Add("@flag", 1);
if (ASHelper.ExecuteNonQuery(strSql, dic) > 0)
{
Response.Write("带参数插入成功!");
}
else
{
Response.Write("带参数插入失败!");
}
dic.Clear();
------------------------
public static int ExecuteNonQuery(string strSql, Dictionary<string, object> paramDic)
{
using (conn = GetConn())
{
using (cmd = GetCmd(conn, strSql,CommandType.Text))
{
try
{
PrepareCommand(null, cmd, paramDic);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (Exception E)
{
ThrowErrorMsgAddLog("ExecuteNonQueryParams", strSql, E.Message);
return 0;
}
}
}
}
如果你的业务逻辑层不复杂,基本就是CRUD+List这样的操作,那么你可以参考经典的PetShop模式,如果业务逻辑相对复杂,那么就是一个很头疼的问题了,因为数据库有自己的方言,要解决这个问题是不容易的。采用ORM是比较不错的方案,但是大多数ORM的API对于业务逻辑层来说比较生涩淫秽——比如NHibernate,像Linq to SQL那样优雅便捷的框架又有可能过于轻量级对于大项目性能上力不从心,ADO.NET Entity Framework刚走上正轨,资料相对匮乏,可供参考的案例并不多,也不是很容易就能投产的,所以这是个比较难的抉择。
学习
用NHibernate或Castle的ActiveRecord,使用HQL就可以由框架提供多数据库支持。当然可能免不了写一些存储过程,那么就只能尽量写标准SQL。