静态工厂 + DbHelper

作者:上海建筑防水有限公司  来源:www.yxjzfs.com   发布时间:2017-09-07 12:52:12
静态工厂 + DbHelper 在 .NET 的学习过程中用过三种数据库:Sql Server、Access、SQLite。Sql Server 用得相对多一点点,但是,麻烦,每次用它都需要开服务,而且还费资源,更麻烦的是拷贝到一台没有装SqlServer的电脑上还不能用,所以一般练习中只要不涉及到什么存储过程这些也基本不用它。Access简单的文件型数据库,office的套件,基本的SQL语句也支持,在一般的小型应用系统中用起来还行,而且在Windows 7开始操作系统中就已经内置了Access的服务,随便拷贝。SQLite用过一次,需要安装服务,和Access一样,拷贝一下就可以用,就是管理工具的界面比较shit。

用过三种数据库后,发现其实在微软的ADO.NET中操作数据库的方式是一样的,链接对象都是继承自实现了IDbConnection接口的抽象类DbConnection,以及实现了IDbCommand的接口的抽象类DbCommand,其它的都一样。古就可以统一用接口或者抽象来来进行操作数据库了,这样就能够实现基本的跨数据库访问的功能了。唯一不同的就是实例化连接字符串的时候要用具体的子类来进行实例化,这时就可以用静态工厂来实现,从而做到不修改程序就实现夸数据库的功能,当然应用程序中的SQL语句是通用的才行,如果是某些数据库特有的,那就不行了。

静态工厂

也成为简单工厂,主要是用来因对对象的变化,根据不同的要求创建不同的实例,就可以进行一个不同的操作。在黑马的基础加强里面,有一个比较经典的例子能够说明他的作用:简单计算器。主程序中一直不变,变的是运算规则,然后把运算规则给抽出来,写到一个工厂中,然后根据不同的运算符来创建不同的计算实例,然后用一个同一的接口返回这个实例对象,就能够完成计算了。

复制代码

1 /// <summary>

2 /// 根据传递过来的运算符,来创造不同的子类对象

3 /// </summary>

4 /// <param name="op">运算符</param>

5 /// <returns>返回的是一个实现了接口ICalculatorable.ICalculable的子类对象</returns>

6 public static ICalculatorable.ICalculable CreatInstance (string op)

7 {

8 //创建一个接口变量,赋值为null

9 ICalculatorable.ICalculable cc = null;

10 ////根据传递过来的运算符来创建对应的实例成员

11 switch (op)

12 {

13 //如果传递过来的是加法运算符,就创建一个计算加法的实例成员,并且赋值给上面的接口变量

14 case "+": cc = new AddLib_02.Add(); break;

15 case "-": cc = new SubLib_02.Sub(); break;

16 case "*": cc = new MultipLib_02.Multip(); break;

17 case "/": cc = new DivLib_02.Div(); break;

18 case "%": cc = new ModelLib_02.Model(); break;

19 //若上面的都不符合,就将接口变量赋值为null

20 default: cc = null;

21 break;

22 }

23 //返回指向了一个具体实例对象的接口变量

24 return cc;

25 }

复制代码

其实在访问数据库的时候也是一样的,唯一变的就是链接实例,所以就可以把创建实例的东西给抽出来,交给一个工厂来实现,工厂可以通过读取配置文件来进行创建相应的实例对象,然后返回。代码如下:

复制代码

1 internal sealed class DbProvideFactory

2 {

3 private static string dbProvide = ConfigurationManager.AppSettings["provide"];

4 public static string DbProvide { get { return dbProvide; } }

5

6 private static string connectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

7 /// <summary>

8 /// 连接字符串

9 /// </summary>

10 public static string ConnectionString

11 {

12 get { return connectionString; }

13 private set { connectionString = value; }

14 }

15

16

17 #region 返回一个连接对象

18 public static DbConnection GetConnection ()

19 {

20 switch (dbProvide.ToLower())

21 {

22 case "sqlserver":

23 case "sql":

24 case "mssqlserver":

25 case "mssql": return new SqlConnection(connectionString);

26 case "access": return new OleDbConnection(connectionString);

27 case "sqlite": return new SQLiteConnection(connectionString);

28 case "oracle": return new OracleConnection(connectionString);

29 default: return new SqlConnection(connectionString);

30 }

31 }

32 #endregion

33

34 #region 返回一个 Adapter

35 /// <summary>

36 /// 返回一个 Adapter

37 /// </summary>

38 /// <param name="cmd">Command 命令</param>

39 /// <returns></returns>

40 public static DataAdapter GetAdapter (IDbCommand cmd)

41 {

42 switch (dbProvide.ToLower())

43 {

44 case "sqlserver":

45 case "sql":

46 case "mssqlserver":

47 case "mssql": return new SqlDataAdapter(cmd as SqlCommand);

48 case "access": return new OleDbDataAdapter(cmd as OleDbCommand);

49 case "sqlite": return new SQLiteDataAdapter(cmd as SQLiteCommand);

50 case "oracle": return new OracleDataAdapter(cmd as OracleCommand);

51 default: return new SqlDataAdapter(cmd as SqlCommand);

52 }

53 }

54 #endregion

55

56 #region 生成参数化查询时的参数对象

57 /// <summary>

58 /// 生成参数化查询时的参数对象

59 /// </summary>

60 /// <param name="name">参数名,@符号可有可无</param>

61 ///

62 /// <returns></returns>

63 public static DbParameter GetParameter (string name, object value)

64 {

65 if (!name.StartsWith("@"))

66 {

67 name = "@" + name;

68 }

69 if (value == null)

70 {

71 value = DBNull.Value;

72 }

73 switch (dbProvide.ToLower())

74 {

75 case "sqlserver":

76 case "sql":

77 case "mssqlserver":

78 case "mssql": return new SqlParameter(name, value);

79 case "access": return new OleDbParameter(name, value);

80 case "sqlite": return new SQLiteParameter(name, value);

81 case "oracle": return new OracleParameter(name, value);

82 default: return new SqlParameter(name, value);

83 }

84 }

85

86 /// <summary>

87 /// 生成参数化查询时的 输出参数

88 /// </summary>

89 /// <param name="name">参数名</param>

90 /// <param name="type">参数类型</param>

91 /// <returns></returns>

92 public static IDbDataParameter GetParameter (string name,DbType type)

93 {

94 if (!name.StartsWith("@"))

95 {

96 name = "@" + name;

97 }

98 IDbDataParameter p;

99 switch (dbProvide.ToLower())

100 {

101 case "sqlserver":

102 case "sql":

103 case "mssqlserver":

104 case "mssql": p = new SqlParameter(name, type); break;

105 case "access": p = new OleDbParameter(name, type); break;

106 case "sqlite": p = new SQLiteParameter(name, type); break;

107 case "oracle": p = new OracleParameter(name, type); break;

108 default: p = new SqlParameter(name, type); break;

109 }

110 p.Direction = ParameterDirection.Output;

111 return p;

112 }

113 #endregion

114 }

复制代码

上面代码中首先读取了配置文件,以及连接字符串,这点可能封装的是太好,按理说,应该从DbHelper中传递过来,但是考虑到后面多处用到它,就把他放到这个地方了。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:襄阳网站建设公司 https://www.jingchucn.com/zt/xiangyang_wangzhanjianshe/


上一篇:用互联网思维做产品的7个要素
下一篇:最后一页