温馨提示:代码在线浏览功能只能做为源码浏览参考,如果想更进一步了解该代码请下载:SqlHelper源码及使用实例
当前文件:
SqlHelper/App_Code/SqlHelper.cs,打开代码结构图
SqlHelper/App_Code/SqlHelper.cs,打开代码结构图1using System; 2
using System.Data; 3
using System.Configuration; 4
using System.Web; 5
using System.Web.Security; 6
using System.Collections; 7
using System.Data.SqlClient; 8
9
//该源码下载自www.51aspx.com(51aspx.com) 10
/// <summary> 11
/// 数据库的通用访问代码 12
/// 此类为抽象类,不允许实例化,在应用时直接调用即可 13
/// </summary> 14
public abstract class SqlHelper 15
{ 16
//获取数据库连接字符串,其属于静态变量且只读,项目中所有文档可以直接使用,但不能修改 17
public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["pubsConnectionString"].ConnectionString; 18
19
// 哈希表用来存储缓存的参数信息,哈希表可以存储任意类型的参数。 20
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); 21
22
/// <summary> 23
///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。 24
/// 使用参数数组形式提供参数列表 25
/// </summary> 26
/// <remarks> 27
/// 使用示例: 28
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 29
/// </remarks> 30
/// <param name="connectionString">一个有效的数据库连接字符串</param> 31
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 32
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 33
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 34
/// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 35
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 36
{ 37
38
SqlCommand cmd = new SqlCommand(); 39
40
using (SqlConnection conn = new SqlConnection(connectionString)) 41
{ 42
//通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中 43
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 44
int val = cmd.ExecuteNonQuery(); 45
46
//清空SqlCommand中的参数列表 47
cmd.Parameters.Clear(); 48
return val; 49
} 50
} 51
52
/// <summary> 53
///执行一条不返回结果的SqlCommand,通过一个已经存在的数据库连接 54
/// 使用参数数组提供参数 55
/// </summary> 56
/// <remarks> 57
/// 使用示例: 58
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 59
/// </remarks> 60
/// <param name="conn">一个现有的数据库连接</param> 61
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 62
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 63
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 64
/// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 65
public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 66
{ 67
68
SqlCommand cmd = new SqlCommand(); 69
70
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 71
int val = cmd.ExecuteNonQuery(); 72
cmd.Parameters.Clear(); 73
return val; 74
} 75
76
/// <summary> 77
/// 执行一条不返回结果的SqlCommand,通过一个已经存在的数据库事物处理 78
/// 使用参数数组提供参数 79
/// </summary> 80
/// <remarks> 81
/// 使用示例: 82
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 83
/// </remarks> 84
/// <param name="trans">一个存在的 sql 事物处理</param> 85
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 86
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 87
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 88
/// <returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns> 89
public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 90
{ 91
SqlCommand cmd = new SqlCommand(); 92
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters); 93
int val = cmd.ExecuteNonQuery(); 94
cmd.Parameters.Clear(); 95
return val; 96
} 97
98
/// <summary> 99
/// 执行一条返回结果集的SqlCommand命令,通过专用的连接字符串。 100
/// 使用参数数组提供参数 101
/// </summary> 102
/// <remarks> 103
/// 使用示例: 104
/// SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 105
/// </remarks> 106
/// <param name="connectionString">一个有效的数据库连接字符串</param> 107
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 108
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 109
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 110
/// <returns>返回一个包含结果的SqlDataReader</returns> 111
public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 112
{ 113
SqlCommand cmd = new SqlCommand(); 114
SqlConnection conn = new SqlConnection(connectionString); 115
116
// 在这里使用try/catch处理是因为如果方法出现异常,则SqlDataReader就不存在, 117
//CommandBehavior.CloseConnection的语句就不会执行,触发的异常由catch捕获。 118
//关闭数据库连接,并通过throw再次引发捕捉到的异常。 119
try 120
{ 121
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); 122
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 123
cmd.Parameters.Clear(); 124
return rdr; 125
} 126
catch 127
{ 128
conn.Close(); 129
throw; 130
} 131
} 132
133
/// <summary> 134
/// 执行一条返回第一条记录第一列的SqlCommand命令,通过专用的连接字符串。 135
/// 使用参数数组提供参数 136
/// </summary> 137
/// <remarks> 138
/// 使用示例: 139
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 140
/// </remarks> 141
/// <param name="connectionString">一个有效的数据库连接字符串</param> 142
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 143
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 144
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 145
/// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns> 146
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 147
{ 148
SqlCommand cmd = new SqlCommand(); 149
150
using (SqlConnection connection = new SqlConnection(connectionString)) 151
{ 152
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 153
object val = cmd.ExecuteScalar(); 154
cmd.Parameters.Clear(); 155
return val; 156
} 157
} 158
159
/// <summary> 160
/// 执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。 161
/// 使用参数数组提供参数 162
/// </summary> 163
/// <remarks> 164
/// 使用示例: 165
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); 166
/// </remarks> 167
/// <param name="conn">一个已经存在的数据库连接</param> 168
/// <param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 169
/// <param name="commandText">存储过程的名字或者 T-SQL 语句</param> 170
/// <param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param> 171
/// <returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns> 172
public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) 173
{ 174
175
SqlCommand cmd = new SqlCommand(); 176
177
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters); 178
object val = cmd.ExecuteScalar(); 179
cmd.Parameters.Clear(); 180
return val; 181
} 182
183
/// <summary> 184
/// 缓存参数数组 185
/// </summary> 186
/// <param name="cacheKey">参数缓存的键值</param> 187
/// <param name="cmdParms">被缓存的参数列表</param> 188
public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) 189
{ 190
parmCache[cacheKey] = commandParameters; 191
} 192
193
/// <summary> 194
/// 获取被缓存的参数 195
/// </summary> 196
/// <param name="cacheKey">用于查找参数的KEY值</param> 197
/// <returns>返回缓存的参数数组</returns> 198
public static SqlParameter[] GetCachedParameters(string cacheKey) 199
{ 200
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey]; 201
202
if (cachedParms == null) 203
return null; 204
205
//新建一个参数的克隆列表 206
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length]; 207
208
//通过循环为克隆参数列表赋值 209
for (int i = 0, j = cachedParms.Length; i < j; i++) 210
//使用clone方法复制参数列表中的参数 211
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone(); 212
213
return clonedParms; 214
} 215
216
/// <summary> 217
/// 为执行命令准备参数 218
/// </summary> 219
/// <param name="cmd">SqlCommand 命令</param> 220
/// <param name="conn">已经存在的数据库连接</param> 221
/// <param name="trans">数据库事物处理</param> 222
/// <param name="cmdType">SqlCommand命令类型 (存储过程, T-SQL语句, 等等。)</param> 223
/// <param name="cmdText">Command text,T-SQL语句 例如 Select * from Products</param> 224
/// <param name="cmdParms">返回带参数的命令</param> 225
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) 226
{ 227
228
//判断数据库连接状态 229
if (conn.State != ConnectionState.Open) 230
conn.Open(); 231
232
cmd.Connection = conn; 233
cmd.CommandText = cmdText; 234
235
//判断是否需要事物处理 236
if (trans != null) 237
cmd.Transaction = trans; 238
239
cmd.CommandType = cmdType; 240
241
if (cmdParms != null) 242
{ 243
foreach (SqlParameter parm in cmdParms) 244
cmd.Parameters.Add(parm); 245
} 246
} 247
}







