首頁 > 後端開發 > C#.Net教程 > 詳解C# .NET更聰明的資料庫操作的封裝

詳解C# .NET更聰明的資料庫操作的封裝

迷茫
發布: 2017-03-26 14:36:01
原創
1751 人瀏覽過

前述:

  對資料庫操作的封裝,相信網路上已經有一大堆,ORM框架,或是.NET本身的EF,都很好的支援資料庫操作。這篇文章是分享自己所思考的,對資料庫操作的簡單封裝。我對於這篇文章,認為被瀏覽者所關注重點的是怎麼分析設計資料庫操作封裝,程式碼是其次。而且,這是我第一篇文章,為了想好怎麼實現花了些天,程式碼是部落格發表時現寫的。所以我想,使用可能還有bug,而且沒有try catch異常的設計。

  這個框架我理應做到對資料庫無關,無論是哪個資料庫都能夠使用。不過,重點在於分析,而不是程式碼。所以,為了更好的闡述,我只做了對sql Server的封裝,對其他的話,瀏覽者可以自己設計;框架可支援鍊式寫法,我想,在許多程式語言,大家對鍊式寫法大不會陌生,所以我想,資料庫存取也可以做成鍊式的模式。這個框架不需要寫sql語句,對任何的操作,都只需要簡單的傳所需的參數,封裝好對應的操作。

  在閱讀文章之前最好有些泛型、反射、Link的基礎,不然閱讀可能會有些費力。

 

進入重點:

  框架的結構比較簡單,使用簡單工廠模式,因此筆者就不畫一張UML圖來解釋,而用文字對裡面方法進行描述。

  在設計工廠介面時候,應該考慮介面中應該含有鍊式寫入必須的三個階段(也稱部分):資料庫基本操作(打開,關閉,創建等)、資料庫的增刪改查、資料庫返回的資料(這裡我做為執行階段,估計大家會好奇為什麼不是上一階段,大家往下閱讀就知道)和不是必須的事務操作。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace Dal

{

    public interface DbHelper

    {

        /// <summary>

        /// 创建数据库连接

        /// </summary>

        /// <param name="connectionString">连接字符串</param>

        /// <returns></returns>

        DbHelper createConnection(string connectionString);

 

        /// <summary>

        /// 打开数据库

        /// </summary>

        /// <returns></returns>

        DbHelper openConnection();

 

        /// <summary>

        /// 关闭数据库

        /// </summary>

        /// <returns></returns>

        DbHelper closeConnection();

 

        /// <summary>

        /// 释放sqlConnection对象

        /// </summary>

        void DisposedConnection();

 

        /// <summary>

        /// 释放sqlCommand对象

        /// </summary>

        void DisposedCommand();

 

        /// <summary>

        /// 创建sqlCommand对象

        /// </summary>

        /// <returns></returns>

        DbHelper createCommand();

 

        /// <summary>

        /// 设置sqlCommand的类型

        /// </summary>

        /// <param name="type">CommandType枚举类型</param>

        /// <returns></returns>

        DbHelper setCommandType(CommandType type);

         

        /// <summary>

        /// 要查询的表(多表以逗号隔开)、存储过程、视图名

        /// </summary>

        /// <param name="Name"></param>

        /// <returns></returns>

        DbHelper FromName(string Name);

 

        /// <summary>

        /// 创建事务

        /// </summary>

        /// <returns></returns>

        DbHelper beginTransaction();

 

        /// <summary>

        /// 事务回滚

        /// </summary>

        /// <returns></returns>

        DbHelper TransactionRowBack();

 

        /// <summary>

        /// 事务提交

        /// </summary>

        /// <returns></returns>

        DbHelper TransactionCommit();

 

        /// <summary>

        /// 对多张表间的列进行联系

        /// </summary>

        /// <param name="Fields">表间联系的字段</param>

        /// <returns></returns>

        DbHelper ForMulTable(string Fields);

 

        /// <summary>

        /// 查询

        /// </summary>

        /// <param name="Fields">查询字段</param>

        /// <param name="Where">查询条件字典</param>

        /// <param name="otherWhere">其他条件</param>

        /// <returns></returns>

        DbHelper Select(string Fields = "*", Dictionary<string, object> Where = null, string otherWhere = "");

 

        /// <summary>

        /// 更新

        /// </summary>

        /// <param name="model">需要更新的对象</param>

        /// <param name="Where">更新条件</param>

        /// <param name="Fields">更新字段</param>

        /// <param name="otherWhere">其他条件</param>

        /// <returns></returns>

        DbHelper Update(object model, Dictionary<string, object> Where, string Fields = "", string otherWhere = "");

 

        /// <summary>

        /// 插入

        /// </summary>

        /// <param name="model">需要插入的对象</param>

        /// <param name="Fields">需要插入的字段</param>

        /// <returns></returns>

        DbHelper Insert(object model, string Fields = "");

 

        /// <summary>

        /// 删除

        /// </summary>

        /// <param name="Where">删除条件</param>

        /// <param name="otherWhere">其他条件</param>

        /// <returns></returns>

        DbHelper Delete(Dictionary<string, object> Where, string otherWhere = "");

 

 

        /// <summary>

        /// 查询返回List

        /// </summary>

        /// <typeparam name="T">模型</typeparam>

        /// <returns></returns>

        List<T> ToList<T>()

            where T : class ,new();

 

         

        /// <summary>

        /// 查询返回DataSet

        /// </summary>

        /// <param name="DatasetName"></param>

        /// <returns></returns>

        DataSet ToDataSet(string DatasetName);

 

        /// <summary>

        /// 查询返回DataTable

        /// </summary>

        /// <returns></returns>

        DataTable ToDataTable();

 

        /// <summary>

        /// 执行存储过程

        /// </summary>

        /// <param name="Parameter">存储过程参数</param>

        /// <returns></returns>

        DbHelper ExcuteProc(Dictionary<string, object> Parameter);

 

        /// <summary>

        /// 执行返回查询第一行第一列值

        /// </summary>

        /// <returns></returns>

        object Result();

 

        /// <summary>

        /// 返回执行的影响行数

        /// </summary>

        /// <returns></returns>

        int ExcuteResult();

 

        /// <summary>

        /// 用户自定义sqlCommand

        /// </summary>

        /// <param name="fun">委托</param>

        void UserDefineOperation(Action<dynamic> fun);

    }

}

登入後複製

  好了,看完程式碼,大家對具體實現應該還是一頭霧水,那,接下來一步步分析具體實現,是以sql Server來分析。

  在具體實作的類別中SQLHelper,設計中所必須的欄位。在一開始設計時候,我在想怎麼給各個資料庫相容,因為它們使用的執行物件Command是不同的,所以為了能夠更好封裝的函式庫,將其設計sqlCommand不暴露給外部使用,而是在內部使用。暴露方法能夠設定com的屬性,以及ExcuteName就存放著執行資料的物件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//连接字符串

        string ConnectionString;

         

        //数据库连接对象

        private SqlConnection conn;

 

        //执行对象

        SqlCommand com;

 

        //表、存储过程、视图名称

        string ExcuteName;

 

        //事务

        SqlTransaction tran;

 

        //sql语句

        StringBuilder sqlBuilderString;

 

        //参数

        SqlParameter[] paras;

登入後複製

 第一部分:資料庫基本操作

##  createConnection方法:這個方法其實就是new sqlConnection,對其賦值connectionString,也採用了大家一般使用的單例模式,這樣也會在執行的時候比較安全。不過這個單例是指一個Helper對應一個sqlConnection,而不是設計成static,因為我覺得有些項目在存取的資料庫有可能有多個。而且在創建時候,對其進行打開和關閉一次,為了檢查能否真的能使用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

public DbHelper createConnection(string connectionString)

        {

            if (!ConnectionCanUse())

            {

                this.ConnectionString = connectionString;

                conn = new SqlConnection(this.ConnectionString);

            }

 

            return this;

        }

 

        /// <summary>

        /// 检查conn是否能用

        /// </summary>

        /// <returns></returns>

        public bool ConnectionCanUse()

        {

            if (conn == null)

                return false;

            try

            {

                conn.Open();

                conn.Close();

            }catch(Exception e)

            {

                return false;

            }

             

            return true;

        }

登入後複製

  開啟、關閉、釋放connection和建立command就不作解釋了,因為裡面就一句話。

  關於基本操作,還有就是關於sqlCommandType的設置,因為預存程序和普通的語句等操作字串明顯是不同,因此要寫個方法來設定它。 #

  第二部分:增删改查的操作 这里就解释为什么sql语句不是在这个阶段执行。我觉得,如果将具体的执行放在这个阶段,那么就会导致方法重载过多,为什么?因为并不是所有人都能考虑到使用者要返回的类型,比如我想要List,或者DataSet等等,而且还会将这个方法的作用过重:在我设计的这些方法中,实操作的是对sql语句的生成,所以说为什么不能在这边执行,那么就不能重用。是吧,这样设计很灵活,将数据库真正执行放在下个阶段。而且这些方法都是链式的写法,所以会对执行能够很灵活的控制,最重要能够重用,不需要写别的重载方法,只需要一个方法。

  生成sql语句在这也是简单的封装,如果要做起真的框架,我觉得sql字符串的组合还应该创建一个类,来更智能的组合用户的需求。

  自然,里面使用到反射、Linq。不过笔者也一步步解释,将怎么设计分享给大家。

  大家看到Select、Insert、Update、Delete的接口都有Where的条件字典。没错,反射就在这里使用。为了考虑到数据库的安全,所以sql自然只是简单的拼接,还应该使用参数。所以,反射就用在Where生成参数上。大家也许还看到别的otherWhere,这个怎么不设计成参数,因为Where能够实现的,其实就是赋值语句,也就是表内某字段 = 值,所以需要。在otherWhere中,存放的是其他特殊的条件。前面说这里设计的不完美,就因为如此,其实有些条件 like 或者 使用or ,虽然能够写在otherWhere中,但是没办法使用参数来控制。

  那么接下来就是Fiels参数了,这个在各个方法充当不同的作用。Select是查询的字段,Update中是更新的字段,在Insert中是插入的字段,这样就灵活的控制了。在这些字段为空的时候,默认为全部,反射在这里就使用了,遍历模型对象中的属性,然后将它们一个个填进sql语句中。在这里比较注意的应该是插入,因为大家在写sql语句时候是这样的 insert tableName values(value,value....)这样的格式,这样是因为sql会自己对应值插入,而在程序中的模型类中,我想大家写属性可不是按顺序的吧,所以在反射遍历时候,就有可能将几个本来待在某个列位置的值去换了位置的情况。所以,这里在遍历的时候,应该按插入的完全格式来设计,也就是 insert tableName(Field,Field...) values(value,value...)。

  在这几个方法中,Delete最简单。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public DbHelper Select(string Fields = "*",Dictionary<string,object> Where = null,string otherWhere = "")

        {

            sqlBuilderString = new StringBuilder();

 

            sqlBuilderString.AppendLine("select " + Fields + " from " + this.ExcuteName);

            List<SqlParameter> paras = new List<SqlParameter>();

            sqlBuilderString.AppendLine(" where 1 = 1 ");           

            if (Where != null && Where.Count > 0)

            {

                paras = new List<SqlParameter>();                //遍历Where,将里面的条件添加到sqlParamter和sql语句中

                Where.Keys.ToList().ForEach(o => {

                    sqlBuilderString.AppendLine(" and "+ o + " = @" + o);

                    paras.Add(new SqlParameter(o, Where[o]));

                });

            }            if(!string.IsNullOrEmpty(otherWhere))

            {

                sqlBuilderString.AppendLine(otherWhere);

            }            this.paras = paras.ToArray();            return this;

        }

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public DbHelper Update(object model,Dictionary<string, object> Where,string Fields = "", string otherWhere = "")

        {

            Type t = model.GetType();

            List<string> keys = Where.Keys.ToList();

            sqlBuilderString = new StringBuilder();            bool firstnode = true;

            sqlBuilderString.AppendLine("update "+ExcuteName + " set ");

            List<SqlParameter> paras = new List<SqlParameter>();            if(string.IsNullOrEmpty(Fields))

            {

                t.GetProperties().ToList().ForEach(o =>

                {                    if (!firstnode)

                        sqlBuilderString.Append(",");                    else

                        firstnode = false;                    if(!keys.Contains(o.Name))

                    {

                        sqlBuilderString.AppendLine(o.Name + " = @"+o.Name);

                        paras.Add(new SqlParameter(o.Name,o.GetValue(model,null)));

                    }

                });

            }else

            {

                Fields.Split(&#39;,&#39;).ToList().ForEach(o =>

                {

                    sqlBuilderString.AppendLine(o + " = @" + o);

                    paras.Add(new SqlParameter(o, t.GetProperty(o).GetValue(model, null)));

                });

            }            this.paras = paras.ToArray();            return this;

        }

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

public DbHelper Insert(object model,string Fields = "")

        {

            List<SqlParameter> paras = new List<SqlParameter>();

            Type t = model.GetType();

            sqlBuilderString = new StringBuilder();

            sqlBuilderString.AppendLine("insert " + ExcuteName);            if(string.IsNullOrEmpty(Fields))

            {                string s = "";                string s1="";

                t.GetProperties().ToList().ForEach(o =>

                {

                    s += o.Name + ",";

                    s1 += " @" + o.Name + ",";

                    paras.Add(new SqlParameter(o.Name, o.GetValue(model, null)));

                });

                s.Remove(s.LastIndexOf(&#39;,&#39;),1);

                s1.Remove(s.LastIndexOf(&#39;,&#39;), 1);

                sqlBuilderString.AppendLine("(" + s + ")");

                sqlBuilderString.AppendLine(" values(" + s1 + ")");

            }else

            {

                sqlBuilderString.AppendLine("(" + Fields + ")");                string s = "";

                Fields.Split(&#39;,&#39;).ToList().ForEach(o =>

                {

                    s += " @" + o + ",";

                    paras.Add(new SqlParameter(o, t.GetProperty(o).GetValue(model, null)));

                });

                sqlBuilderString.AppendLine(" values(" + s + ")");

            }            this.paras = paras.ToArray();            return this;

        }

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

public DbHelper Delete(Dictionary<string,object> Where,string otherWhere = "")

        {

            sqlBuilderString = new StringBuilder();

            List<SqlParameter> paras = new List<SqlParameter>();

            sqlBuilderString.AppendLine("delete " + ExcuteName);

            sqlBuilderString.AppendLine(" where 1 = 1 ");

 

            Where.Keys.ToList().ForEach(o =>

            {

                sqlBuilderString.AppendLine(" and " + o + " = @" + o);

                paras.Add(new SqlParameter(o, Where[o]));

            });            this.paras = paras.ToArray();            return this;

        }

登入後複製

最后一个阶段,那就是执行阶段,这里封装了些执行的方法。

这个也是简单,最重要的方法应该是setCommand,这个方法是对sqlCommand进行设置,执行的语句,以及添加参数。

1

2

3

4

5

6

7

8

9

private void setCommand()

        {            if(com.CommandType== CommandType.StoredProcedure)

            {                this.com.CommandText = ExcuteName;

            }else

            {                this.com.CommandText = sqlBuilderString.ToString();

            }            this.paras.ToList().ForEach(o =>

            {                this.com.Parameters.Add(o);

            });

        }

登入後複製

其他就是执行的语句。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

public List<T> ToList<T>()            where T:class ,new()

        {

            List<T> list = new List<T>();

            setCommand();

            SqlDataReader reader = com.ExecuteReader();

            Type t = typeof(T);

            List<PropertyInfo> pros = t.GetProperties().ToList();            while(reader.Read())

            {

                T model = new T();

                pros.ForEach(o =>

                {

                    o.SetValue(model, reader[o.Name], null);

                });

                list.Add(model);

            }

            reader.Dispose();            return list;

        }        public DataSet ToDataSet(string DatasetName = "")

        {

            DataSet ds = new DataSet();

            setCommand();

            SqlDataAdapter adapter = new SqlDataAdapter(com);

 

            adapter.Fill(ds, string.IsNullOrEmpty(DatasetName) ? this.ExcuteName.Replace(",", "_") : DatasetName);

            adapter.Dispose();            return ds;

        }        public DataTable ToDataTable()

        {

            DataTable dt = new DataTable();

            setCommand();

            SqlDataAdapter adapter = new SqlDataAdapter(com);

            adapter.Fill(dt);

            adapter.Dispose();            return dt;

        }        public object Result()

        {

            setCommand();            return com.ExecuteScalar();

        }        public int ExcuteResult()

        {

            setCommand();            return com.ExecuteNonQuery();

        }        public DbHelper ExcuteProc(Dictionary<string,object> Parameter)

        {

            List<SqlParameter> paras = new List<SqlParameter>();

 

            Parameter.Keys.ToList().ForEach(o =>

            {

                paras.Add(new SqlParameter(o, Parameter[o]));

            });            return this;

        }

登入後複製

当然,还不能少了让用户自定义的方法,所以最后还留了个方法,参数是委托。委托里面的参数还是动态类型,这就懂了吧,想用户怎么用,你就怎么定义。

1

2

3

4

public void UserDefineOperation(Action<dynamic> fun)

        {

            fun(this.com);

        }

登入後複製

好了,设计也就到这里,下面就贴上SQLHelper完整的代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Reflection;namespace Dal

{    public class SQLHelper:DbHelper

    {        //连接字符串

        string ConnectionString;       

        //数据库连接对象

        private SqlConnection conn;        //执行对象        SqlCommand com;        //表、存储过程、视图名称

        string ExcuteName;        //事务        SqlTransaction tran;        //sql语句        StringBuilder sqlBuilderString;        //参数        SqlParameter[] paras;        private SQLHelper()

        {

 

        }        /// <summary>

        /// 创建sqlHelper静态方法        /// </summary>

        /// <returns></returns>

        public static DbHelper getInstance()

        {            return new SQLHelper();

        }        /// <summary>

        ///

        /// </summary>

        /// <param name="connectionString">

        /// <returns></returns>

        public DbHelper createConnection(string connectionString)

        {            if (!ConnectionCanUse())

            {                this.ConnectionString = connectionString;

                conn = new SqlConnection(this.ConnectionString);

            }            return this;

        }        /// <summary>

        /// 检查conn是否能用        /// </summary>

        /// <returns></returns>

        public bool ConnectionCanUse()

        {            if (conn == null)                return false;            try

            {

                conn.Open();

                conn.Close();

            }catch(Exception e)

            {                return false;

            }           

            return true;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper openConnection()

        {            if(conn.State != ConnectionState.Open)            this.conn.Open();            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper closeConnection()

        {            if(conn.State != ConnectionState.Closed)            this.conn.Close();            return this;

        }        /// <summary>

        ///

        /// </summary>

        public void DisposedConnection()

        {            if (!ConnectionBeUsed())                this.conn.Dispose();

        }        /// <summary>

        /// 检查数据库是否在被打开使用        /// </summary>

        /// <returns></returns>

        public bool ConnectionBeUsed()

        {            if(conn.State == ConnectionState.Open)                return true;            return false;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper createCommand()

        {            if (this.com == null)

            {                this.com = new SqlCommand();

                com.Connection = this.conn;

            }          

            return this;

        }        /// <summary>

        ///

        /// </summary>

        public void DisposedCommand()

        {            this.com.Dispose();

        }        /// <summary>

        ///

        /// </summary>

        /// <param name="type">

        /// <returns></returns>

        public DbHelper setCommandType(CommandType type)

        {            this.com.CommandType = type;            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <param name="Name">

        /// <returns></returns>

        public DbHelper FromName(string Name)

        {            this.ExcuteName = Name;            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper beginTransaction()

        {            this.tran = conn.BeginTransaction();

            com.Transaction = this.tran;            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper TransactionRowBack()

        {            if(tran!=null)

            {

                tran.Rollback();

            }            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <returns></returns>

        public DbHelper TransactionCommit()

        {            if(tran!=null)

            {

                tran.Commit();

                tran = null;

            }            return this;

        }        /// <summary>

        ///

        /// </summary>

        /// <param name="Fields">

        /// <param name="Where">

        /// <param name="otherWhere">

        /// <returns></returns>

        public DbHelper Select(string Fields = "*",Dictionary<string,object> Where = null,string otherWhere = "")

        {

            sqlBuilderString = new StringBuilder();

 

            sqlBuilderString.AppendLine("select " + Fields + " from " + this.ExcuteName);

            List<SqlParameter> paras = new List<SqlParameter>();

            sqlBuilderString.AppendLine(" where 1 = 1 ");           

            if (Where != null && Where.Count > 0)

            {

                paras = new List<SqlParameter>();                //遍历Where,将里面的条件添加到sqlParamter和sql语句中

                Where.Keys.ToList().ForEach(o => {

                    sqlBuilderString.AppendLine(" and "+ o + " = @" + o);

                    paras.Add(new SqlParameter(o, Where[o]));

                });

            }            if(!string.IsNullOrEmpty(otherWhere))

            {

                sqlBuilderString.AppendLine(otherWhere);

            }            this.paras = paras.ToArray();            return this;

        }       

        public DbHelper ForMulTable(string Fields)

        {

            List<string> tables = ExcuteName.Split(',').ToList();

            Fields.Split(',').ToList().ForEach(o =>

            {                for(int i = 0;i<tables.count-2;i++) {="" sqlbuilderstring.appendline("="" and="" "="" +="" tables[i]="" "."="" o="" ."="" o);="" }="" });="" return="" this;="" public="" dbhelper="" update(object="" model,dictionary<string,="" object>="" where,string="" fields="""," string="" otherwhere=""")" type="" t="model.GetType();" list<string>="" keys="Where.Keys.ToList();" sqlbuilderstring="new" stringbuilder();="" bool="" firstnode="true;" sqlbuilderstring.appendline("update="" "+excutename="" "="" set="" ");="" list<sqlparameter>="" paras="new" list<sqlparameter>();="" if(string.isnullorempty(fields))="" t.getproperties().tolist().foreach(o=">" if="" (!firstnode)="" sqlbuilderstring.append(",");="" else="" if(!keys.contains(o.name))="" sqlbuilderstring.appendline(o.name="" paras.add(new="" sqlparameter(o.name,o.getvalue(model,null)));="" }else="" fields.split(&#39;,&#39;).tolist().foreach(o=">" sqlbuilderstring.appendline(o="" sqlparameter(o,="" t.getproperty(o).getvalue(model,="" null)));="" this.paras="paras.ToArray();" insert(object="" model,string="" sqlbuilderstring.appendline("insert="" excutename);="" s=""";" s1=""";" ",";="" @"="" o.name="" sqlparameter(o.name,="" o.getvalue(model,="" s.remove(s.lastindexof(&#39;,&#39;),1);="" s1.remove(s.lastindexof(&#39;,&#39;),="" 1);="" sqlbuilderstring.appendline("("="" ")");="" sqlbuilderstring.appendline("="" values("="" delete(dictionary<string,object>="" sqlbuilderstring.appendline("delete="" where="" 1="1" where.keys.tolist().foreach(o=">" where[o]));="" private="" void="" setcommand()="" if(com.commandtype="=" commandtype.storedprocedure)="" this.com.commandtext="ExcuteName;" this.paras.tolist().foreach(o=">" this.com.parameters.add(o);="" list<t>="" tolist<t>()="" t:class="" ,new()="" list="new" list<t>();="" setcommand();="" sqldatareader="" reader="com.ExecuteReader();" list<propertyinfo>="" pros="t.GetProperties().ToList();" while(reader.read())="" model="new" t();="" pros.foreach(o=">" o.setvalue(model,="" reader[o.name],="" null);="" list.add(model);="" reader.dispose();="" list;="" dataset="" todataset(string="" datasetname=""")" ds="new" dataset();="" sqldataadapter="" adapter="new" sqldataadapter(com);="" adapter.fill(ds,="" string.isnullorempty(datasetname)="" ?="" this.excutename.replace(",",="" "_")="" :="" datasetname);="" adapter.dispose();="" ds;="" datatable="" todatatable()="" dt="new" datatable();="" adapter.fill(dt);="" dt;="" object="" result()="" com.executescalar();="" int="" excuteresult()="" com.executenonquery();="" excuteproc(dictionary<string,object>="" parameter)="" parameter.keys.tolist().foreach(o=">" parameter[o]));="" userdefineoperation(action<dynamic>="" fun)="" fun(this.com);="" }<="" pre=""><div class="contentsignin">登入後複製</div></tables.count-2;i++)></string>

最后还有两个事务的方法,前面忘记说了,其实就是SqlTransaction,在里面的sqlCommand加上这个,就可以实现。或许有人会问,如果有同一时间段有好几个sqlCommand怎么办?不会的,sqlCommand我也设置成单例,就不会发生控制不了的事情了。

 

  結束語:第一次的博客,我雖然做過不少“幼稚作品”,畢竟我是大三學生,如果隨意的寫文章,我擔心只是會成為被嘲笑的對象,幼稚的「作品」也不好意思放在網路上給大家看。所以,在想了幾天,寫了我覺得蠻有用的封裝,雖然可能對許多項目不起作用,但是讀者可以自己在更深的思考。

  這個框架,我覺得應該還能更好的封裝,例如從sql語句組合,呼叫的時候發生異常處理,怎麼更好的實作鍊式組合,多資料庫的處理控制,加上鎖我覺得也是可以,畢竟做web的時候可不是像winform,每個端都有自己的connection。還有一個我覺得不錯的,就是在模型上做處理,加上特性,讓框架能夠辨識主鍵,外鍵,在程式中建立sql中的聯繫等。那就給讀者思考了。

 

以上是詳解C# .NET更聰明的資料庫操作的封裝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板