虽然日常工作中都是调用别人写好的底层,但是要真正学到技术,还是要懂些底层原理,最好是能自己写底层
一、底层
注:引用命名空间
using System.Data;
using System.Data.SqlClient;
1 public class SqlHelper 2 { 3 /// <summary> 4 /// 数据库连接字符串 5 /// Data Source=数据库地址;Initial Catalog=数据库名称;Persist Security Info=True;User ID=用户名;Password=密码 6 /// </summary> 7 private string _SqlConnectionStr = ""; 8 public string SqlConnectionStr { get { return _SqlConnectionStr; } } 9 public SqlHelper(string connStr) 10 { 11 this._SqlConnectionStr = connStr; 12 } 13 #region 单值查询 14 public string GetSingle(string sqlStr) 15 { 16 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 17 { 18 using (SqlCommand cmd = new SqlCommand(sqlStr, conn)) 19 { 20 try 21 { 22 conn.Open(); 23 return String.Format("{0}", cmd.ExecuteScalar()); 24 } 25 catch(SqlException e) 26 { 27 throw e; 28 } 29 finally 30 { 31 conn.Close(); 32 } 33 } 34 } 35 } 36 public string GetSingle(string sqlStr,SqlParameter[] cmdParams) 37 { 38 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 39 { 40 using (SqlCommand cmd = new SqlCommand()) 41 { 42 try 43 { 44 conn.Open(); 45 cmd.Connection = conn; 46 cmd.CommandType = CommandType.Text; 47 cmd.CommandText = sqlStr; 48 cmd.Parameters.AddRange(cmdParams); 49 return String.Format("{0}", cmd.ExecuteScalar()); 50 } 51 catch(SqlException e) 52 { 53 throw e; 54 } 55 finally 56 { 57 conn.Close(); 58 } 59 } 60 } 61 } 62 #endregion 63 64 #region 查询数据集 65 public DataSet Query(string sqlStr) 66 { 67 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 68 { 69 using (SqlDataAdapter ada = new SqlDataAdapter(sqlStr, conn)) 70 { 71 try 72 { 73 conn.Open(); 74 DataSet ds = new DataSet(); 75 ada.Fill(ds); 76 return ds; 77 } 78 catch(SqlException e) 79 { 80 throw e; 81 } 82 finally 83 { 84 conn.Close(); 85 } 86 } 87 } 88 } 89 public DataSet Query(string sqlStr,SqlParameter[] cmdParams) 90 { 91 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 92 { 93 using (SqlCommand cmd = new SqlCommand()) 94 { 95 using (SqlDataAdapter ada = new SqlDataAdapter(cmd)) 96 { 97 try 98 { 99 conn.Open(); 100 cmd.Connection = conn; 101 cmd.CommandType = CommandType.Text; 102 cmd.CommandText = sqlStr; 103 cmd.Parameters.AddRange(cmdParams); 104 105 DataSet ds = new DataSet(); 106 ada.Fill(ds); 107 return ds; 108 } 109 catch(SqlException e) 110 { 111 throw e; 112 } 113 finally 114 { 115 conn.Close(); 116 } 117 } 118 } 119 } 120 } 121 public DataSet RunProcedure(string procName,SqlParameter[] cmdParams) 122 { 123 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 124 { 125 using (SqlCommand cmd = new SqlCommand()) 126 { 127 using (SqlDataAdapter ada = new SqlDataAdapter(cmd)) 128 { 129 try 130 { 131 conn.Open(); 132 cmd.Connection = conn; 133 cmd.CommandType = CommandType.StoredProcedure; 134 cmd.CommandText = procName; 135 cmd.Parameters.AddRange(cmdParams); 136 137 DataSet ds = new DataSet(); 138 ada.Fill(ds); 139 return ds; 140 } 141 catch(SqlException e) 142 { 143 throw e; 144 } 145 finally 146 { 147 conn.Close(); 148 } 149 } 150 } 151 } 152 } 153 #endregion 154 155 #region 单表查询 156 public DataTable GetQueryData(string sqlStr) 157 { 158 DataSet ds = Query(sqlStr); 159 if (ds != null && ds.Tables.Count > 0) 160 return ds.Tables[0]; 161 return null; 162 } 163 public DataTable GetQueryData(string sqlStr ,SqlParameter[] cmdParams) 164 { 165 DataSet ds = Query(sqlStr, cmdParams); 166 if (ds != null && ds.Tables.Count > 0) 167 return ds.Tables[0]; 168 return null; 169 } 170 public DataTable GetProcData(string procName,SqlParameter[] cmdParams) 171 { 172 DataSet ds = RunProcedure(procName, cmdParams); 173 if (ds != null && ds.Tables.Count > 0) 174 return ds.Tables[0]; 175 return null; 176 } 177 #endregion 178 179 #region 单行查询 180 public DataRow GetQueryRecord(string sqlStr) 181 { 182 DataTable dt = GetQueryData(sqlStr); 183 if (dt != null && dt.Rows.Count > 0) 184 return dt.Rows[0]; 185 return null; 186 } 187 public DataRow GetQueryRecord(string sqlStr,SqlParameter[] cmdParams) 188 { 189 DataTable dt = GetQueryData(sqlStr, cmdParams); 190 if (dt != null && dt.Rows.Count > 0) 191 return dt.Rows[0]; 192 return null; 193 } 194 public DataRow GetProcRecord(string procName,SqlParameter[] cmdParams) 195 { 196 DataTable dt = GetProcData(procName, cmdParams); 197 if (dt != null && dt.Rows.Count > 0) 198 return dt.Rows[0]; 199 return null; 200 } 201 #endregion 202 203 #region 使用完应关闭Reader 204 public SqlDataReader ExecuteReader(string sqlStr) 205 { 206 SqlConnection conn = new SqlConnection(this._SqlConnectionStr); 207 SqlCommand cmd = new SqlCommand(sqlStr, conn); 208 try 209 { 210 conn.Open(); 211 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 212 } 213 catch(SqlException e) 214 { 215 throw e; 216 } 217 } 218 public SqlDataReader ExecuteReeder(string sqlStr,SqlParameter[] cmdParams) 219 { 220 SqlConnection conn = new SqlConnection(this._SqlConnectionStr); 221 SqlCommand cmd = new SqlCommand(); 222 try 223 { 224 conn.Open(); 225 cmd.Connection = conn; 226 cmd.CommandType = CommandType.Text; 227 cmd.CommandText = sqlStr; 228 cmd.Parameters.AddRange(cmdParams); 229 return cmd.ExecuteReader(CommandBehavior.CloseConnection); 230 } 231 catch(SqlException e) 232 { 233 throw e; 234 } 235 } 236 #endregion 237 238 #region 执行sql语句 239 public int ExecuteSql(string sqlStr) 240 { 241 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 242 { 243 using (SqlCommand cmd = new SqlCommand(sqlStr, conn)) 244 { 245 try 246 { 247 conn.Open(); 248 return cmd.ExecuteNonQuery(); 249 } 250 catch(SqlException e) 251 { 252 throw e; 253 } 254 finally 255 { 256 conn.Close(); 257 } 258 } 259 } 260 } 261 public int ExecuteSql(string sqlStr,SqlParameter[] cmdParams) 262 { 263 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 264 { 265 using (SqlCommand cmd = new SqlCommand()) 266 { 267 try 268 { 269 conn.Open(); 270 cmd.Connection = conn; 271 cmd.CommandType = CommandType.Text; 272 cmd.CommandText = sqlStr; 273 cmd.Parameters.AddRange(cmdParams); 274 return cmd.ExecuteNonQuery(); 275 } 276 catch(SqlException e) 277 { 278 throw e; 279 } 280 finally 281 { 282 conn.Close(); 283 } 284 } 285 } 286 } 287 #endregion 288 289 #region 执行事务 290 public int ExecuteSqlTran(List<string> sqlStrList) 291 { 292 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 293 { 294 using (SqlCommand cmd = new SqlCommand()) 295 { 296 using (SqlTransaction tran = conn.BeginTransaction()) 297 { 298 try 299 { 300 cmd.Connection = conn; 301 cmd.CommandType = CommandType.Text; 302 cmd.Transaction = tran; 303 conn.Open(); 304 int count = 0; 305 foreach(string sql in sqlStrList) 306 { 307 cmd.CommandText = sql; 308 count += cmd.ExecuteNonQuery(); 309 } 310 tran.Commit(); 311 return count; 312 } 313 catch(SqlException e) 314 { 315 tran.Rollback(); 316 throw e; 317 } 318 finally 319 { 320 conn.Close(); 321 } 322 } 323 } 324 } 325 } 326 public int ExecuteSqlTran(List<KeyValuePair<string,SqlParameter[]>> sqlStrList) 327 { 328 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 329 { 330 using (SqlCommand cmd = new SqlCommand()) 331 { 332 using (SqlTransaction tran = conn.BeginTransaction()) 333 { 334 try 335 { 336 cmd.Connection = conn; 337 cmd.CommandType = CommandType.Text; 338 cmd.Transaction = tran; 339 conn.Open(); 340 int count = 0; 341 foreach(var item in sqlStrList) 342 { 343 cmd.CommandText = item.Key; 344 cmd.Parameters.Clear(); 345 cmd.Parameters.AddRange(item.Value); 346 count += cmd.ExecuteNonQuery(); 347 } 348 tran.Commit(); 349 return count; 350 } 351 catch(SqlException e) 352 { 353 tran.Rollback(); 354 throw e; 355 } 356 finally 357 { 358 conn.Close(); 359 } 360 } 361 } 362 } 363 } 364 public int ExecuteProc(string procName,SqlParameter[] cmdParams) 365 { 366 using (SqlConnection conn = new SqlConnection(this._SqlConnectionStr)) 367 { 368 using (SqlCommand cmd = new SqlCommand()) 369 { 370 try 371 { 372 conn.Open(); 373 cmd.Connection = conn; 374 cmd.CommandType = CommandType.StoredProcedure; 375 cmd.CommandText = procName; 376 cmd.Parameters.AddRange(cmdParams); 377 return cmd.ExecuteNonQuery(); 378 } 379 catch(SqlException e) 380 { 381 throw e; 382 } 383 finally 384 { 385 conn.Close(); 386 } 387 } 388 } 389 } 390 #endregion 391 }
二、工厂模式
1 public class DbProvider 2 { 3 private static string _SqlConnectionStr = null; 4 public static string SqlConnectionStr 5 { 6 get 7 { 8 string connStr = _SqlConnectionStr; 9 if (connStr == null) 10 connStr = "Data Source=(local);Initial Catalog=testDB;Persist Security Info=True;User ID=sa;Password=123456"; //一般这里是读取项目配置文件里的数据库参数来生成连接字符串 11 return connStr; 12 } 13 } 14 public static SqlHelper SqlServer 15 { 16 get 17 { 18 return new SqlHelper(SqlConnectionStr); 19 } 20 } 21 }
三、实例使用
1 public class Demo 2 { 3 public DataTable QueryOrderInfo(string id) 4 { 5 string sql = "select * from order where id=@id"; 6 SqlParameter[] cmdParams = new SqlParameter[] { new SqlParameter("@id", id) }; 7 return DbProvider.SqlServer.GetQueryData(sql, cmdParams); 8 } 9 }