步步为营 .NET三层架构解析 三、SQLHelper设计
数据库设计好了,我们开始设计SQLHelper了,是一个SQL基类.
连接数据源:
private SqlConnection myConnection = null; private readonly string RETURNVALUE = "RETURNVALUE";
打开数据库连接.
private void Open() { // 打开数据库连接 if (myConnection == null) { // myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); myConnection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString()); } if (myConnection.State == ConnectionState.Closed) { try { ///打开数据库连接 myConnection.Open(); } catch (Exception ex) { SystemError.CreateErrorLog(ex.Message); } finally { ///关闭已经打开的数据库连接 } } }
关闭数据库连接
public void Close() { ///判断连接是否已经创建 if (myConnection != null) { ///判断连接的状态是否打开 if (myConnection.State == ConnectionState.Open) { myConnection.Close(); } } }
释放资源
public void Dispose() { // 确认连接是否已经关闭 if (myConnection != null) { myConnection.Dispose(); myConnection = null; } }
执行无参数和返回int型的存储过程
public int RunProc(string procName) { SqlCommand cmd = CreateProcCommand(procName, null); try { ///执行存储过程 cmd.ExecuteNonQuery(); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } ///返回存储过程的参数值 return (int)cmd.Parameters[RETURNVALUE].Value; }
执行传入参数和返回int型的存储过程
public int RunProc(string procName, SqlParameter[] prams) { SqlCommand cmd = CreateProcCommand(procName, prams); try { ///执行存储过程 cmd.ExecuteNonQuery(); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } ///返回存储过程的参数值 return (int)cmd.Parameters[RETURNVALUE].Value; }
执行存储过程和返回SqlDataReader
public void RunProc(string procName, out SqlDataReader dataReader) { ///创建Command SqlCommand cmd = CreateProcCommand(procName, null); try { ///读取数据 dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { dataReader = null; ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } }
执行传入参数和返回SqlDataReader存储过程
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader) { ///创建Command SqlCommand cmd = CreateProcCommand(procName, prams); try { ///读取数据 dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { dataReader = null; ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } }
执行无参数存储过程返回DataSet
public void RunProc(string procName, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateProcDataAdapter(procName, null); try { ///读取数据 da.Fill(dataSet); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
执行传入参数的存储过程返回DataSet
public void RunProc(string procName, SqlParameter[] prams, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateProcDataAdapter(procName, prams); try { ///读取数据 da.Fill(dataSet); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
执行传入参数和表名的存储过程返回DataSet
public void RunProc(string procName, SqlParameter[] prams, string TableName, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateProcDataAdapter(procName, prams); try { ///读取数据 da.Fill(dataSet, TableName); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
执行无参数SQL语句
public int RunSQL(string cmdText) { SqlCommand cmd = CreateSQLCommand(cmdText, null); try { ///执行存储过程 cmd.ExecuteNonQuery(); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } ///返回存储过程的参数值 return (int)cmd.Parameters[RETURNVALUE].Value; }
执行传入参数SQL语句
public int RunSQL(string cmdText, SqlParameter[] prams) { SqlCommand cmd = CreateSQLCommand(cmdText, prams); try { ///执行存储过程 cmd.ExecuteNonQuery(); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } ///返回存储过程的参数值 return (int)cmd.Parameters[RETURNVALUE].Value; }
执行无参数SQL语句返回SqlDataReader
public void RunSQL(string cmdText, out SqlDataReader dataReader) { ///创建Command SqlCommand cmd = CreateSQLCommand(cmdText, null); try { ///读取数据 dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { dataReader = null; ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } }
执行传入参数SQL语句返回SqlDataReader
public void RunSQL(string cmdText, SqlParameter[] prams, out SqlDataReader dataReader) { ///创建Command SqlCommand cmd = CreateSQLCommand(cmdText, prams); try { ///读取数据 dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception ex) { dataReader = null; ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } }
执行无参数SQL语句返回DataSet
public void RunSQL(string cmdText, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateSQLDataAdapter(cmdText, null); try { ///读取数据 da.Fill(dataSet); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
执行传入参数SQL语句返回DataSet
public void RunSQL(string cmdText, SqlParameter[] prams, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateProcDataAdapter(cmdText, prams); try { ///读取数据 da.Fill(dataSet); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
执行传入参数SQL语句和表名返回DataSet
public void RunSQL(string cmdText, SqlParameter[] prams, string TableName, ref DataSet dataSet) { if (dataSet == null) { dataSet = new DataSet(); } ///创建SqlDataAdapter SqlDataAdapter da = CreateProcDataAdapter(cmdText, prams); try { ///读取数据 da.Fill(dataSet, TableName); } catch (Exception ex) { ///记录错误日志 SystemError.CreateErrorLog(ex.Message); } finally { ///关闭数据库的连接 Close(); } }
创建一个SqlCommand对象以此来执行存储过程
private SqlCommand CreateProcCommand(string procName, SqlParameter[] prams) { ///打开数据库连接 Open(); ///设置Command SqlCommand cmd = new SqlCommand(procName, myConnection); cmd.CommandType = CommandType.StoredProcedure; ///添加把存储过程的参数 if (prams != null) { foreach (SqlParameter parameter in prams) { cmd.Parameters.Add(parameter); } } ///添加返回参数ReturnValue cmd.Parameters.Add( new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); ///返回创建的SqlCommand对象 return cmd; }
创建一个SqlCommand对象以此来执行存储过程
private SqlCommand CreateSQLCommand(string cmdText, SqlParameter[] prams) { ///打开数据库连接 Open(); ///设置Command SqlCommand cmd = new SqlCommand(cmdText, myConnection); ///添加把存储过程的参数 if (prams != null) { foreach (SqlParameter parameter in prams) { cmd.Parameters.Add(parameter); } } ///添加返回参数ReturnValue cmd.Parameters.Add( new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); ///返回创建的SqlCommand对象 return cmd; }
创建一个SqlDataAdapter对象,用此来执行存储过程
private SqlDataAdapter CreateProcDataAdapter(string procName, SqlParameter[] prams) { ///打开数据库连接 Open(); ///设置SqlDataAdapter对象 SqlDataAdapter da = new SqlDataAdapter(procName, myConnection); da.SelectCommand.CommandType = CommandType.StoredProcedure; ///添加把存储过程的参数 if (prams != null) { foreach (SqlParameter parameter in prams) { da.SelectCommand.Parameters.Add(parameter); } } ///添加返回参数ReturnValue da.SelectCommand.Parameters.Add( new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); ///返回创建的SqlDataAdapter对象 return da; }
创建一个SqlDataAdapter对象,用此来执行SQL语句
private SqlDataAdapter CreateSQLDataAdapter(string cmdText, SqlParameter[] prams) { ///打开数据库连接 Open(); ///设置SqlDataAdapter对象 SqlDataAdapter da = new SqlDataAdapter(cmdText, myConnection); ///添加把存储过程的参数 if (prams != null) { foreach (SqlParameter parameter in prams) { da.SelectCommand.Parameters.Add(parameter); } } ///添加返回参数ReturnValue da.SelectCommand.Parameters.Add( new SqlParameter(RETURNVALUE, SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null)); ///返回创建的SqlDataAdapter对象 return da; }
生成存储过程参数
public SqlParameter CreateParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value) { SqlParameter param; ///当参数大小为0时,不使用该参数大小值 if (Size > 0) { param = new SqlParameter(ParamName, DbType, Size); } else { ///当参数大小为0时,不使用该参数大小值 param = new SqlParameter(ParamName, DbType); } ///创建输出类型的参数 param.Direction = Direction; if (!(Direction == ParameterDirection.Output && Value == null)) { param.Value = Value; } ///返回创建的参数 return param; }
传入输入参数
public SqlParameter CreateInParam(string ParamName, SqlDbType DbType, int Size, object Value) { return CreateParam(ParamName, DbType, Size, ParameterDirection.Input, Value); }
传入返回值参数
public SqlParameter CreateOutParam(string ParamName, SqlDbType DbType, int Size) { return CreateParam(ParamName, DbType, Size, ParameterDirection.Output, null); }
传入返回值参数
public SqlParameter CreateReturnParam(string ParamName, SqlDbType DbType, int Size) { return CreateParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null); }
把所有这些方法放在SQLHelper.cs类里.再建一个SQLTools.cs,里面的方法如下:
public class SystemException : Exception { /// <summary> /// 包含系统Excepton /// </summary> public SystemException(string source, string message, Exception inner) : base(message, inner) { base.Source = source; } /// <summary> /// 不包含系统Excepton /// </summary> public SystemException(string source, string message) : base(message) { base.Source = source; } } /// <summary> /// 处理网页中的HTML代码,并消除危险字符 /// </summary> public class SystemHTML { private static string HTMLEncode(string fString) { if (fString != string.Empty) { ///替换尖括号 fString.Replace("<", "<"); fString.Replace(">", "&rt;"); ///替换引号 fString.Replace(((char)34).ToString(), """); fString.Replace(((char)39).ToString(), "'"); ///替换空格 fString.Replace(((char)13).ToString(), ""); ///替换换行符 fString.Replace(((char)10).ToString(), "<BR> "); } return (fString); } } /// <summary> /// SystemTools 的摘要说明。 /// </summary> public class SystemTools { /// <summary> /// 将DataReader转为DataTable /// </summary> /// <param name="DataReader">DataReader</param> public static DataTable ConvertDataReaderToDataTable(SqlDataReader dataReader) { ///定义DataTable DataTable datatable = new DataTable(); try { ///动态添加表的数据列 for (int i = 0; i < dataReader.FieldCount; i++) { DataColumn myDataColumn = new DataColumn(); myDataColumn.DataType = dataReader.GetFieldType(i); myDataColumn.ColumnName = dataReader.GetName(i); datatable.Columns.Add(myDataColumn); } ///添加表的数据 while (dataReader.Read()) { DataRow myDataRow = datatable.NewRow(); for (int i = 0; i < dataReader.FieldCount; i++) { myDataRow[i] = dataReader[i].ToString(); } datatable.Rows.Add(myDataRow); myDataRow = null; } ///关闭数据读取器 dataReader.Close(); return datatable; } catch (Exception ex) { ///抛出类型转换错误 SystemError.CreateErrorLog(ex.Message); throw new Exception(ex.Message, ex); } } }
主要是处理异常和一些特殊字符.
再建一个SystemError.cs,里面的方法如下:
public class SystemError { private static string m_fileName = "c:\\Systemlog.txt"; public static String FileName { get { return (m_fileName); } set { if (value != null || value != "") { m_fileName = value; } } } public static void CreateErrorLog(string message) { if (File.Exists(m_fileName)) { ///如果日志文件已经存在,则直接写入日志文件 StreamWriter sr = File.AppendText(FileName); sr.WriteLine("\n"); sr.WriteLine(DateTime.Now.ToString() + message); sr.Close(); } else { ///创建日志文件 StreamWriter sr = File.CreateText(FileName); sr.Close(); } } }
主要记录日志.
我们的SQLHelper类就建完了,接下来我们就开始建Model类了.欢迎拍砖.