SqlHelper封装

     首先,SqlHelper要定义为抽象类型的。原因:抽象类型的不能实例化。

    其次,抽象的SqlHelper中的函数类型为Static静态的。原因:非静态的抽象类中的函数不引用不能使用。

 

1,框架

1     public abstract class SqlHelper
2     {
3         //数据库连接字符串
4         public static string connectionString = ConnectionString; //读取配置文件中的连接字符串
5         public SqlHelper()
6         {            
7         }
8      }

 

2,不带参数的操作

2.1查询

 1 /// <summary>
 2         /// 执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
 3         /// </summary>
 4         /// <param name="strSQL">查询语句</param>
 5         /// <returns>SqlDataReader</returns>
 6         public static SqlDataReader ExecuteReader(string strSQL)
 7         {
 8             SqlConnection connection = new SqlConnection(connectionString);
 9             SqlCommand cmd = new SqlCommand(strSQL, connection);
10             try
11             {
12                 connection.Open();
13                 SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
14                 return myReader;
15             }
16             catch (System.Data.SqlClient.SqlException e)
17             {
18                 throw e;
19             }   
20 
21         }
22         /// <summary>
23         /// 执行查询语句,返回DataSet
24         /// </summary>
25         /// <param name="SQLString">查询语句</param>
26         /// <returns>DataSet</returns>
27         public static DataSet Query(string SQLString)
28         {
29             using (SqlConnection connection = new SqlConnection(connectionString))
30             {
31                 DataSet ds = new DataSet();
32                 try
33                 {
34                     connection.Open();
35                     SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
36                     command.Fill(ds, "ds");
37                 }
38                 catch (System.Data.SqlClient.SqlException ex)
39                 {
40                     throw new Exception(ex.Message);
41                 }
42                 return ds;
43             }
44         }

 

2.2查询带事务

 1  /// <summary>
 2         /// 执行多条SQL语句,实现数据库事务。
 3         /// </summary>
 4         /// <param name="SQLStringList">多条SQL语句的集合</param>        
 5         public static int ExecuteSqlTran(List<String> SQLStringList)
 6         {
 7             using (SqlConnection conn = new SqlConnection(connectionString))
 8             {
 9                 conn.Open();
10                 SqlCommand cmd = new SqlCommand();
11                 cmd.Connection = conn;
12 
13                 SqlTransaction tx = conn.BeginTransaction();//实例化事务,并开始执行事务
14                 cmd.Transaction = tx; 
15                 try
16                 {
17                     int count = 0;
18                     for (int n = 0; n < SQLStringList.Count; n++)
19                     {
20                         string strsql = SQLStringList[n];
21                         if (strsql.Trim().Length > 1)
22                         {
23                             cmd.CommandText = strsql;
24                             count += cmd.ExecuteNonQuery();
25                         }
26                     }
27                     tx.Commit();//提交事务
28                     return count;
29                 }
30                 catch
31                 {
32                     tx.Rollback();//事务回滚
33                     return 0;
34                 }
35             }
36         }

 

 3,带参数的查询

3.1存储过程为参数

 1 /// <summary>
 2         /// 执行带一个存储过程参数的的SQL语句。
 3         /// </summary>
 4         /// <param name="SQLString">SQL语句</param>
 5         /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
 6         /// <returns>影响的记录数</returns>
 7         public static object ExecuteSqlGet(string SQLString, string content)
 8         {
 9             using (SqlConnection connection = new SqlConnection(connectionString))
10             {
11                 SqlCommand cmd = new SqlCommand(SQLString, connection);
12                 System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
13                 myParameter.Value = content;
14                 cmd.Parameters.Add(myParameter);
15                 try
16                 {
17                     connection.Open();
18                     object obj = cmd.ExecuteScalar();
19                     if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
20                     {
21                         return null;
22                     }
23                     else
24                     {
25                         return obj;
26                     }
27                 }
28                 catch (System.Data.SqlClient.SqlException e)
29                 {
30                     throw e;
31                 }
32                 finally
33                 {
34                     cmd.Dispose();
35                     connection.Close();
36                 }
37             }
38         }

 

3.2查询

 1 /// <summary>
 2         /// 执行查询语句,返回DataSet
 3         /// </summary>
 4         /// <param name="SQLString">查询语句</param>
 5         /// <returns>DataSet</returns>
 6         public static DataSet Query(string SQLString, params SqlParameter[] cmdParms)
 7         {
 8             using (SqlConnection connection = new SqlConnection(connectionString))
 9             {
10                 SqlCommand cmd = new SqlCommand();
11                 PrepareCommand(cmd, connection, null, SQLString, cmdParms);
12                 using (SqlDataAdapter da = new SqlDataAdapter(cmd))
13                 {
14                     DataSet ds = new DataSet();
15                     try
16                     {
17                         da.Fill(ds, "ds");
18                         cmd.Parameters.Clear();
19                     }
20                     catch (System.Data.SqlClient.SqlException ex)
21                     {
22                         throw new Exception(ex.Message);
23                     }
24                     return ds;
25                 }
26             }
27         }

 

准备command,将参数附加上去。

 1 private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
 2         {
 3             if (conn.State != ConnectionState.Open)
 4                 conn.Open();
 5             cmd.Connection = conn;
 6             cmd.CommandText = cmdText;
 7             if (trans != null)
 8                 cmd.Transaction = trans;
 9             cmd.CommandType = CommandType.Text;//cmdType;
10             if (cmdParms != null)
11             {
12 
13 
14                 foreach (SqlParameter parameter in cmdParms)
15                 {
16                     if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
17                         (parameter.Value == null))
18                     {
19                         parameter.Value = DBNull.Value;
20                     }
21                     cmd.Parameters.Add(parameter);
22                 }
23             }
24         }

 

3.3非查询

 1 public static int ExecuteSql(string SQLString, params SqlParameter[] cmdParms)
 2         {
 3             using (SqlConnection connection = new SqlConnection(connectionString))
 4             {
 5                 using (SqlCommand cmd = new SqlCommand())
 6                 {
 7                     try
 8                     {
 9                         PrepareCommand(cmd, connection, null, SQLString, cmdParms);
10                         int rows =cmd.ExecuteNonQuery();
11                         cmd.Parameters.Clear();
12                         return rows;
13                     }
14                     catch (System.Data.SqlClient.SqlException e)
15                     {
16                         throw e;
17                     }
18                 }
19             }
20         }

 

3.4事务 (参数为哈希函数)

 1  /// <summary>
 2         /// 执行多条SQL语句,实现数据库事务。
 3         /// </summary>
 4         /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
 5         public static void ExecuteSqlTran(Hashtable SQLStringList)
 6         {
 7             using (SqlConnection conn = new SqlConnection(connectionString))
 8             {
 9                 conn.Open();
10                 using (SqlTransaction trans = conn.BeginTransaction())
11                 {
12                     SqlCommand cmd = new SqlCommand();
13                     try
14                     {
15                         //循环
16                         foreach (DictionaryEntry myDE in SQLStringList)
17                         {
18                             string cmdText = myDE.Key.ToString();
19                             SqlParameter[] cmdParms = (SqlParameter[])myDE.Value;
20                             PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
21                             int val = cmd.ExecuteNonQuery();
22                             cmd.Parameters.Clear();
23                         }
24                         trans.Commit();
25                     }
26                     catch
27                     {
28                         trans.Rollback();
29                         throw;
30                     }
31                 }
32             }
33         }

 

 1 /// <summary>
 2         /// 执行多条SQL语句,实现数据库事务。
 3         /// </summary>
 4         /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
 5         public static int ExecuteSqlTran(System.Collections.Generic.List<CommandInfo> cmdList)
 6         {
 7             using (SqlConnection conn = new SqlConnection(connectionString))
 8             {
 9                 conn.Open();
10                 using (SqlTransaction trans = conn.BeginTransaction())
11                 {
12                     SqlCommand cmd = new SqlCommand();
13                     try
14                     { int count = 0;
15                         //循环
16                         foreach (CommandInfo myDE in cmdList)
17                         {
18                             string cmdText = myDE.CommandText;
19                             SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
20                             PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
21                            
22                             if (myDE.EffentNextType == EffentNextType.WhenHaveContine || myDE.EffentNextType == EffentNextType.WhenNoHaveContine)
23                             {
24                                 if (myDE.CommandText.ToLower().IndexOf("count(") == -1)
25                                 {
26                                     trans.Rollback();
27                                     return 0;
28                                 }
29 
30                                 object obj = cmd.ExecuteScalar();
31                                 bool isHave = false;
32                                 if (obj == null && obj == DBNull.Value)
33                                 {
34                                     isHave = false;
35                                 }
36                                 isHave = Convert.ToInt32(obj) > 0;
37 
38                                 if (myDE.EffentNextType == EffentNextType.WhenHaveContine && !isHave)
39                                 {
40                                     trans.Rollback();
41                                     return 0;
42                                 }
43                                 if (myDE.EffentNextType == EffentNextType.WhenNoHaveContine && isHave)
44                                 {
45                                     trans.Rollback();
46                                     return 0;
47                                 }
48                                 continue;
49                             }
50                             int val = cmd.ExecuteNonQuery();
51                             count += val;
52                             if (myDE.EffentNextType == EffentNextType.ExcuteEffectRows && val == 0)
53                             {
54                                 trans.Rollback();
55                                 return 0;
56                             }
57                             cmd.Parameters.Clear();
58                         }
59                         trans.Commit();
60                         return count;
61                     }
62                     catch
63                     {
64                         trans.Rollback();
65                         throw;
66                     }
67                 }
68             }
69         }

 

 

 

 

 

附:

 1 namespace DBUtility
 2 {
 3     public enum EffentNextType
 4     {
 5         /// <summary>
 6         /// 对其他语句无任何影响 
 7         /// </summary>
 8         None,
 9         /// <summary>
10         /// 当前语句必须为"select count(1) from .."格式,如果存在则继续执行,不存在回滚事务
11         /// </summary>
12         WhenHaveContine,
13         /// <summary>
14         /// 当前语句必须为"select count(1) from .."格式,如果不存在则继续执行,存在回滚事务
15         /// </summary>
16         WhenNoHaveContine,
17         /// <summary>
18         /// 当前语句影响到的行数必须大于0,否则回滚事务
19         /// </summary>
20         ExcuteEffectRows,
21         /// <summary>
22         /// 引发事件-当前语句必须为"select count(1) from .."格式,如果不存在则继续执行,存在回滚事务
23         /// </summary>
24         SolicitationEvent
25     }   
26     public class CommandInfo
27     {
28         public object ShareObject = null;
29         public object OriginalData = null;
30         event EventHandler _solicitationEvent;
31         public event EventHandler SolicitationEvent
32         {
33             add
34             {
35                 _solicitationEvent += value;
36             }
37             remove
38             {
39                 _solicitationEvent -= value;
40             }
41         }
42         public void OnSolicitationEvent()
43         {
44             if (_solicitationEvent != null)
45             {
46                 _solicitationEvent(this,new EventArgs());
47             }
48         }
49         public string CommandText;
50         public System.Data.Common.DbParameter[] Parameters;
51         public EffentNextType EffentNextType = EffentNextType.None;
52         public CommandInfo()
53         {
54 
55         }
56         public CommandInfo(string sqlText, SqlParameter[] para)
57         {
58             this.CommandText = sqlText;
59             this.Parameters = para;
60         }
61         public CommandInfo(string sqlText, SqlParameter[] para, EffentNextType type)
62         {
63             this.CommandText = sqlText;
64             this.Parameters = para;
65             this.EffentNextType = type;
66         }
67     }
68 }

 

      

posted @ 2013-08-26 11:35  李双喆  阅读(355)  评论(0)    收藏  举报