分享一個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

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

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

using System;

using System.Collections.Generic;

using System.Text;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

using System.Reflection;

 

namespace {namespace}.DBUtility

{

    public abstract class SqlHelper

    {

        /// <summary>

        /// 數據庫連接字符串

        /// </summary>

        public static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["SqlConnectionString"].ToString();

        #region 批量數據插入數據庫

        /// <summary>

        /// 批量數據插入數據庫

        /// </summary>

        /// <param name="dt">DataTable</param>

        public static void DataTableToSQLServer(DataTable dt, string TabName) {

            using (SqlConnection destinationConnection = new SqlConnection(ConnectionString)) {

                destinationConnection.Open();

                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection)) {

                    //將DataTable表名作爲待導入庫中的目標表名

                    bulkCopy.DestinationTableName = TabName;

                    foreach (DataColumn item in dt.Columns) {

                        bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);

                    }

                    bulkCopy.WriteToServer(dt);

                }

            }

        }

        #endregion

 

        #region 執行操作,返回表  +static DataTable ExcuteTable(string sql, CommandType type, params SqlParameter[] ps)

        /// <summary>

        /// 執行操作,返回表

        /// </summary>

        /// <param name="sql"></param>

        /// <returns></returns>

        public static DataTable ExcuteTable(string sql, CommandType type, params SqlParameter[] ps) {

            DataTable dt = new DataTable();

            SqlDataAdapter da = new SqlDataAdapter(sql, ConnectionString);

            da.SelectCommand.CommandType = type;

            da.SelectCommand.Parameters.AddRange(ps);

            da.Fill(dt);

            return dt;

        }

        #endregion

 

        #region 執行操作,返回DataSet表集合  +static DataSet ExcuteTable(string sql, CommandType type, params SqlParameter[] ps)

        /// <summary>

        /// 執行操作,返回表

        /// </summary>

        /// <param name="sql"></param>

        /// <returns></returns>

        public static DataSet ExcuteDataSet(string sql, CommandType type, params SqlParameter[] ps) {

            DataSet ds = new DataSet();

            SqlDataAdapter da = new SqlDataAdapter(sql, ConnectionString);

            da.SelectCommand.CommandType = type;

            da.SelectCommand.Parameters.AddRange(ps);

            da.Fill(ds);

            return ds;

        }

        #endregion

 

        #region 返回單個值的泛型版本  -static T ExcuteScalar<T>(string sql, params SqlParameter[] ps)

        /// <summary>

        /// 返回單個值的泛型版本

        /// </summary>

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

        /// <param name="sql"></param>

        /// <param name="ps"></param>

        /// <returns></returns>

        public static T ExcuteScalar<T>(string sql, params SqlParameter[] ps) {

            using (SqlConnection conn = new SqlConnection(ConnectionString)) {

                conn.Open();

                SqlCommand comm = new SqlCommand(sql, conn);

                comm.Parameters.AddRange(ps);

                object obj = comm.ExecuteScalar(); //標識列返回的值的類型不是int而是decimal

                return default(T);

            }

        }

        #endregion

 

        #region 返回泛型集合  + static List<T> GetList<T>(DataTable dt)

        /// <summary>

        /// 返回泛型集合

        /// </summary>

        /// <typeparam name="T">類型佔位,並不是一個真正存在的類型,只在運行的時候才能確定它的類型是什麼</typeparam>

        /// <param name="dt"></param>

        /// <returns></returns>

        public static List<T> GetList<T>(DataTable dt) {

            //int num = dt.Columns.Count;

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

            //獲取當前T所指定的類型

            Type t = typeof(T);

            //通過反射的方式得到類型的屬性

            PropertyInfo[] ps = t.GetProperties();

            foreach (DataRow row in dt.Rows) {

                //每一行對應着一個對象,通過反射的方式創建出對象

                T obj = (T)Activator.CreateInstance(t);

                //不能通過對象.屬性的方式來賦值,因爲屬性是什麼都不知道

                //通過反射的方式爲對象的屬性賦值

                foreach (PropertyInfo p in ps) {

                    string name = p.Name;

                    //表的字段名稱就是類的屬性名稱

                    p.SetValue(obj, row[name], null);

                }

                lists.Add(obj);

            }

            return lists;

        }

        #endregion

 

        #region 用提供的參數,在連接字符串所指定的數據庫中執行SQL語句(非查詢)

        /// <summary>

        /// 用提供的參數,在連接字符串所指定的數據庫中執行SQL語句(非查詢)

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="connectionString">數據庫連接字符串</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>受命令所影響的行數</returns>

        public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

 

            SqlCommand cmd = new SqlCommand();

 

            using (SqlConnection conn = new SqlConnection(connectionString)) {

                PrepareCommand(cmd, conn, null, commandType, commandText, commandParameters);

                int val = cmd.ExecuteNonQuery();

                cmd.Parameters.Clear();

                return val;

            }

        }

        #endregion

 

        #region 用提供的參數和存在的數據庫連接對象,執行SQL語句(非查詢)

        /// <summary>

        /// 用提供的參數和存在的數據庫連接對象,執行SQL語句(非查詢)

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  int result = ExecuteNonQuery(connection, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="connection">存在的數據庫連接對象</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>受命令所影響的行數</returns>

        public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

 

            SqlCommand cmd = new SqlCommand();

 

            PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters);

            int val = cmd.ExecuteNonQuery();

            cmd.Parameters.Clear();

            return val;

        }

        #endregion

 

        #region 用提供的參數和存在的事務對象,執行SQL語句(非查詢)

        /// <summary>

        /// 用提供的參數和存在的事務對象,執行SQL語句(非查詢)

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="trans">存在的事務對象</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>受命令所影響的行數</returns>

        public static int ExecuteNonQuery(SqlTransaction trans, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

            SqlCommand cmd = new SqlCommand();

            PrepareCommand(cmd, trans.Connection, trans, commandType, commandText, commandParameters);

            int val = cmd.ExecuteNonQuery();

            cmd.Parameters.Clear();

            return val;

        }

        #endregion

 

        #region 用提供的參數,在連接字符串所指定的數據庫中執行SQL查詢,並返回結果集(SqlDataReader)

        /// <summary>

        /// 用提供的參數,在連接字符串所指定的數據庫中執行SQL查詢,並返回結果集(SqlDataReader)

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  SqlDataReader r = ExecuteReader(connectionString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="connectionString">數據庫連接字符串</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>一個包含結果的SqlDataReader對象</returns>

        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

            SqlCommand cmd = new SqlCommand();

            SqlConnection conn = new SqlConnection(connectionString);

 

            // 之所以這裏用 try/catch,是因爲:

            // 如果方法拋出異常時,我們希望關閉連接並拋出異常

            // 因爲此時不會返回 DataReader,故 commandBehaviour.CloseConnection 也不起作用

            try {

                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);

                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                cmd.Parameters.Clear();

                return rdr;

            } catch {

                conn.Close();

                throw;

            }

        }

        #endregion

 

        #region 用提供的參數,在連接字符串所指定的數據庫中執行SQL查詢,並返回查詢結果的第一行第一列的值

        /// <summary>

        /// 用提供的參數,在連接字符串所指定的數據庫中執行SQL查詢,並返回查詢結果的第一行第一列的值

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  Object obj = ExecuteScalar(connectionString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="connectionString">數據庫連接字符串</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>一個 object 對象,可用 Convert.To{Type} 轉換爲所需類型</returns>

        public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

            SqlCommand cmd = new SqlCommand();

 

            using (SqlConnection connection = new SqlConnection(connectionString)) {

                PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters);

                object val = cmd.ExecuteScalar();

                cmd.Parameters.Clear();

                return val;

            }

        }

        #endregion

 

        #region 用提供的參數和存在的數據庫連接對象,執行SQL查詢,並返回查詢結果的第一行第一列的值

        /// <summary>

        /// 用提供的參數和存在的數據庫連接對象,執行SQL查詢,並返回查詢結果的第一行第一列的值

        /// </summary>

        /// <remarks>

        /// 使用示例: 

        ///  Object obj = ExecuteScalar(connection, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));

        /// </remarks>

        /// <param name="connection">存在的數據庫連接對象</param>

        /// <param name="commandType">命令類型(存儲過程、文本等)</param>

        /// <param name="commandText">存儲過程名或T-SQL語句</param>

        /// <param name="commandParameters">用於執行命令的參數數組</param>

        /// <returns>一個 object 對象,可用 Convert.To{Type} 轉換爲所需類型</returns>

        public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) {

 

            SqlCommand cmd = new SqlCommand();

 

            PrepareCommand(cmd, connection, null, commandType, commandText, commandParameters);

            object val = cmd.ExecuteScalar();

            cmd.Parameters.Clear();

            return val;

        }

        #endregion

 

        #region 用提供的參數和存在的數據庫連接對象,執行SQL查詢,並返回查詢結果的DatSet結果集

        /// <summary>

        /// 用提供的參數和存在的數據庫連接對象,執行SQL查詢,並返回查詢結果的DatSet結果集

        /// </summary>

        /// <param name="connectionString">鏈接語句</param>

        /// <param name="commandText">sql語句</param>

        /// <param name="commandType">查詢模式</param>

        /// <param name="commandParameters">Parameter參數</param>

        /// <returns></returns>

        static public DataSet ExecuteDataSet(string connectionString, string commandText, CommandType commandType, params SqlParameter[] commandParameters) {

            DataSet ds = new DataSet();

            using (SqlConnection con = new SqlConnection(ConnectionString)) {

                SqlDataAdapter adapter = new SqlDataAdapter();

                SqlCommand cmd = new SqlCommand();

                PrepareCommand(cmd, con, null, commandType, commandText, commandParameters);

                adapter.SelectCommand = cmd;

                adapter.Fill(ds);

            }

            return ds;

        }

        #endregion

 

        #region 構建一個用於執行的命令對象

        /// <summary>

        /// 構建一個用於執行的命令對象

        /// </summary>

        /// <param name="cmd">SqlCommand 對象</param>

        /// <param name="conn">SqlConnection 對象</param>

        /// <param name="trans">SqlTransaction 對象</param>

        /// <param name="cmdType">命令類型(存儲過程、文本等)</param>

        /// <param name="cmdText">存儲過程名或T-SQL語句</param>

        /// <param name="cmdParms">用於執行命令的參數數組</param>

        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {

 

            if (conn.State != ConnectionState.Open)

                conn.Open();

 

            cmd.Connection = conn;

            cmd.CommandText = cmdText;

 

            if (trans != null)

                cmd.Transaction = trans;

 

            cmd.CommandType = cmdType;

 

            if (cmdParms != null) {

                foreach (SqlParameter parm in cmdParms)

                    cmd.Parameters.Add(parm);

            }

        }

        #endregion

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章