winform--权限系统--01--框架介绍,通用数据库访问类介绍
以下是学习笔记:
参考:https://www.bilibili.com/video/BV1LK4y1k7HM?t=2583 感谢朝夕教育
一,项目框架介绍:
二,数据库的分析和创建
1,数据库的设计:
2,创建数据库的过程:
USE [master] GO /****** Object: Database [RightDBase] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ --数据库文件路径:'D:\课程\新课程\DBase' 改成本地存在的路径 --CREATE DATABASE [RightDBase] CREATE DATABASE RightDBase CONTAINMENT = NONE ON PRIMARY --( NAME = N'RightDBase', FILENAME = N'D:\课程\新课程\DBase\RightDBase.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) ( NAME = 'RightDBase', FILENAME = 'D:\DB\RightDBase.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON --( NAME = N'RightDBase_log', FILENAME = N'D:\课程\新课程\DBase\RightDBase_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) ( NAME = 'RightDBase_log', FILENAME = 'D:\DB\RightDBase_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) ALTER DATABASE [RightDBase] SET COMPATIBILITY_LEVEL = 110 GO GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [RightDBase].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [RightDBase] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [RightDBase] SET ANSI_NULLS OFF GO ALTER DATABASE [RightDBase] SET ANSI_PADDING OFF GO ALTER DATABASE [RightDBase] SET ANSI_WARNINGS OFF GO ALTER DATABASE [RightDBase] SET ARITHABORT OFF GO ALTER DATABASE [RightDBase] SET AUTO_CLOSE OFF GO ALTER DATABASE [RightDBase] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [RightDBase] SET AUTO_SHRINK OFF GO ALTER DATABASE [RightDBase] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [RightDBase] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [RightDBase] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [RightDBase] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [RightDBase] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [RightDBase] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [RightDBase] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [RightDBase] SET DISABLE_BROKER GO ALTER DATABASE [RightDBase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [RightDBase] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [RightDBase] SET TRUSTWORTHY OFF GO ALTER DATABASE [RightDBase] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [RightDBase] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [RightDBase] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [RightDBase] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [RightDBase] SET RECOVERY FULL GO ALTER DATABASE [RightDBase] SET MULTI_USER GO ALTER DATABASE [RightDBase] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [RightDBase] SET DB_CHAINING OFF GO ALTER DATABASE [RightDBase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [RightDBase] SET TARGET_RECOVERY_TIME = 0 SECONDS GO EXEC sys.sp_db_vardecimal_storage_format N'RightDBase', N'ON' GO USE [RightDBase] GO /****** Object: Table [dbo].[MenuInfos] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[MenuInfos]( [MenuId] [int] IDENTITY(1,1) NOT NULL, [MenuName] [nvarchar](50) NOT NULL, [ParentId] [int] NOT NULL, [FrmName] [varchar](500) NULL, [MKey] [nchar](10) NULL, CONSTRAINT [PK_MenuInfos] PRIMARY KEY CLUSTERED ( [MenuId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: Table [dbo].[RoleInfos] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[RoleInfos]( [RoleId] [int] IDENTITY(1,1) NOT NULL, [RoleName] [nvarchar](50) NULL, [Remark] [nvarchar](500) NULL, [IsAdmin] [int] NOT NULL, CONSTRAINT [PK_RoleInfos] PRIMARY KEY CLUSTERED ( [RoleId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[RoleMenuInfos] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[RoleMenuInfos]( [RMId] [int] IDENTITY(1,1) NOT NULL, [RoleId] [int] NOT NULL, [MenuId] [int] NOT NULL, CONSTRAINT [PK_RoleMenuInfos] PRIMARY KEY CLUSTERED ( [RMId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[UserInfos] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[UserInfos]( [UserId] [int] IDENTITY(101,1) NOT NULL, [UserName] [varchar](20) NOT NULL, [UserPwd] [varchar](50) NOT NULL, CONSTRAINT [PK_UserInfos] PRIMARY KEY CLUSTERED ( [UserId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO /****** Object: Table [dbo].[UserRoleInfos] Script Date: 2020/4/3 星期五 下午 8:44:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UserRoleInfos]( [URId] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [RoleId] [int] NOT NULL, CONSTRAINT [PK_UserRoleInfos] PRIMARY KEY CLUSTERED ( [URId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET IDENTITY_INSERT [dbo].[MenuInfos] ON INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (1, N'系统管理', 0, NULL, NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (2, N'新增菜单', 1, N'sm.FrmAddMenuInfo', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (3, N'菜单列表', 1, N'sm.FrmMenuList', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (4, N'角色列表', 1, N'sm.FrmRoleList', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (5, N'权限分配', 1, N'sm.FrmRight', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (6, N'用户列表', 1, N'sm.FrmUserList', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (8, N'新增用户', 6, N'sm.FrmUserInfo', NULL) INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (10, N'成绩管理', 0, N'', N'Alt+S ') INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (11, N'成绩列表', 10, N'score.FrmScoreList', N' ') INSERT [dbo].[MenuInfos] ([MenuId], [MenuName], [ParentId], [FrmName], [MKey]) VALUES (12, N'成绩信息', 10, N'score.FrmScoreInfo', N' ') SET IDENTITY_INSERT [dbo].[MenuInfos] OFF SET IDENTITY_INSERT [dbo].[RoleInfos] ON INSERT [dbo].[RoleInfos] ([RoleId], [RoleName], [Remark], [IsAdmin]) VALUES (1, N'超级管理员', N'具有一切权限', 1) INSERT [dbo].[RoleInfos] ([RoleId], [RoleName], [Remark], [IsAdmin]) VALUES (3, N'系统管理员', N'负责系统管理功能。ssssssssddddd', 0) INSERT [dbo].[RoleInfos] ([RoleId], [RoleName], [Remark], [IsAdmin]) VALUES (4, N'成绩管理员', N'负责成绩信息管理', 0) SET IDENTITY_INSERT [dbo].[RoleInfos] OFF SET IDENTITY_INSERT [dbo].[RoleMenuInfos] ON INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (7, 3, 1) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (8, 3, 2) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (9, 3, 3) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (10, 3, 6) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (11, 3, 8) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (12, 4, 10) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (13, 4, 11) INSERT [dbo].[RoleMenuInfos] ([RMId], [RoleId], [MenuId]) VALUES (14, 4, 12) SET IDENTITY_INSERT [dbo].[RoleMenuInfos] OFF SET IDENTITY_INSERT [dbo].[UserInfos] ON INSERT [dbo].[UserInfos] ([UserId], [UserName], [UserPwd]) VALUES (101, N'admin', N'admin') INSERT [dbo].[UserInfos] ([UserId], [UserName], [UserPwd]) VALUES (102, N'lyc001', N'123456') SET IDENTITY_INSERT [dbo].[UserInfos] OFF SET IDENTITY_INSERT [dbo].[UserRoleInfos] ON INSERT [dbo].[UserRoleInfos] ([URId], [UserId], [RoleId]) VALUES (1, 101, 1) INSERT [dbo].[UserRoleInfos] ([URId], [UserId], [RoleId]) VALUES (3, 102, 3) SET IDENTITY_INSERT [dbo].[UserRoleInfos] OFF ALTER TABLE [dbo].[RoleInfos] ADD CONSTRAINT [DF_RoleInfos_IsAdmin] DEFAULT ((0)) FOR [IsAdmin] GO ALTER TABLE [dbo].[RoleMenuInfos] WITH CHECK ADD CONSTRAINT [FK_RoleMenuInfos_RoleInfos] FOREIGN KEY([RoleId]) REFERENCES [dbo].[RoleInfos] ([RoleId]) GO ALTER TABLE [dbo].[RoleMenuInfos] CHECK CONSTRAINT [FK_RoleMenuInfos_RoleInfos] GO ALTER TABLE [dbo].[UserRoleInfos] WITH CHECK ADD CONSTRAINT [FK_UserRoleInfos_RoleInfos] FOREIGN KEY([UserId]) REFERENCES [dbo].[UserInfos] ([UserId]) GO ALTER TABLE [dbo].[UserRoleInfos] CHECK CONSTRAINT [FK_UserRoleInfos_RoleInfos] GO ALTER TABLE [dbo].[UserRoleInfos] WITH CHECK ADD CONSTRAINT [FK_UserRoleInfos_RoleInfos1] FOREIGN KEY([RoleId]) REFERENCES [dbo].[RoleInfos] ([RoleId]) GO ALTER TABLE [dbo].[UserRoleInfos] CHECK CONSTRAINT [FK_UserRoleInfos_RoleInfos1] GO USE [master] GO ALTER DATABASE [RightDBase] SET READ_WRITE GO
三,数据访问
1,通用数据访问类
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PM.DAL.Helper { /// <summary> /// 数据库帮助类(工具类) 静态类操作起来更快 /// </summary> public static class DBHelper { /// <summary> /// 连接字符串 /// </summary> private static string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; /// <summary> /// 增、删、改的通用方法 /// 执行Sql语句或存储过程,返回受影响的行数 /// SQL注入 /// </summary> /// <param name="sql">sql语句或存储过程名</param> /// <param name="cmdType">执行的脚本类型 1:sql语句 2:存储过程</param> /// <param name="parameters">参数列表</param> /// <returns></returns> public static int ExecuteNonQuery(string sql,int cmdType,params SqlParameter[] parameters) { //select @@Identity 返回上一次插入记录时自动产生的ID int result = 0;//返回结果 using (SqlConnection conn = new SqlConnection(connStr)) { //执行脚本的对象cmd SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters); result = cmd.ExecuteNonQuery();//执行T-SQL并返回受影响行数 cmd.Parameters.Clear(); } //using原理:类似于try finally return result; } /// <summary> /// 执行sql查询,返回第一行第一列的值 /// </summary> /// <param name="sql">sql语句或存储过程</param> /// <param name="cmdType">执行的脚本类型 1:sql语句 2:存储过程</param> /// <param name="parameters">参数列表</param> /// <returns></returns> public static object ExecuteScalar(string sql,int cmdType, params SqlParameter[] parameters) { //params 只能写在一维数组之前,且只能标识参数列表中的最后一个参数 //select @@Identity 返回上一次插入记录时自动产生的ID object result = null;//返回结果 using (SqlConnection conn = new SqlConnection(connStr)) { //执行脚本的对象cmd SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters); result = cmd.ExecuteScalar();//执行T-SQL并返回第一行第一列的值 cmd.Parameters.Clear(); if (result == null || result == DBNull.Value) { return null; } else { return result; } } } /// <summary> /// 执行sql查询,返回SqlDataReader对象 /// </summary> /// <param name="sql">sql语句或存储过程</param> /// <param name="cmdType">执行的脚本类型 1:sql语句 2:存储过程</param> /// <param name="parameters">参数列表</param> /// <returns></returns> public static SqlDataReader ExecuteReader(string sql,int cmdType,params SqlParameter[] parameters) { SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters); SqlDataReader reader; try { reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; } catch (Exception ex) { conn.Close(); throw new Exception("创建reader对象发生异常", ex); } } /// <summary> /// 执行查询,查询结果填充到DataTable 只针对查询一个表的情况 /// </summary> /// <param name="sql">sql语句或存储过程</param> /// <param name="cmdType">执行的脚本类型 1:sql语句 2:存储过程</param> /// <param name="parameters">参数列表</param> /// <returns></returns> public static DataTable GetDataTable(string sql,int cmdType,params SqlParameter[] parameters) { DataTable dt = null; using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters); SqlDataAdapter da = new SqlDataAdapter(cmd); dt = new DataTable(); da.Fill(dt); } return dt; } /// <summary> /// 执行查询,数据填充到DataSet /// </summary> /// <param name="sql">sql语句或存储过程</param> /// <param name="cmdType">执行的脚本类型 1:sql语句 2:存储过程</param> /// <param name="parameters">参数列表</param> /// <returns></returns> public static DataSet GetDataSet(string sql, int cmdType, params SqlParameter[] parameters) { DataSet ds = null; using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = BuilderCommand(conn, sql, cmdType, null, parameters); //数据适配器 //conn 自动打开 断开式连接 SqlDataAdapter da = new SqlDataAdapter(cmd); ds = new DataSet(); da.Fill(ds); //自动关闭conn } return ds; } /// <summary> /// 事务 执行批量sql /// </summary> /// <param name="listSql"></param> /// <returns></returns> public static bool ExecuteTrans(List<string> listSql) { using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); SqlTransaction trans = conn.BeginTransaction(); SqlCommand cmd = BuilderCommand(conn, "", 1, trans); try { int count = 0; for (int i = 0; i < listSql.Count; i++) { if (listSql[i].Length > 0) { cmd.CommandText = listSql[i]; cmd.CommandType = CommandType.Text; count += cmd.ExecuteNonQuery(); } } trans.Commit(); return true; } catch (Exception ex) { trans.Rollback(); throw new Exception("执行事务出现异常", ex); } } } /// <summary> /// 事务 批量执行 CommandInfo 包括sql,脚本类型,参数列表 /// </summary> /// <param name="comList"></param> /// <returns></returns> public static bool ExecuteTrans(List<CommandInfo> comList) { using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); SqlTransaction trans = conn.BeginTransaction(); SqlCommand cmd = BuilderCommand(conn, "", 1, trans); try { int count = 0; for (int i = 0; i < comList.Count; i++) { cmd.CommandText = comList[i].CommandText; if (comList[i].IsProc) cmd.CommandType = CommandType.StoredProcedure; else cmd.CommandType = CommandType.Text; if (comList[i].Paras.Length > 0) { cmd.Parameters.Clear();//记得清空,一定要记住 foreach (var p in comList[i].Paras) { cmd.Parameters.Add(p); } } count += cmd.ExecuteNonQuery(); } trans.Commit(); return true; } catch (Exception ex) { trans.Rollback(); throw new Exception("执行事务出现异常", ex); } } } //public static T ExecuteSql<T>(string sql, int cmdType, DbParameter[] paras, Func<IDbCommand, T> action) //{ // using (DbConnection conn = new SqlConnection(connStr)) // { // conn.Open(); // IDbCommand cmd = conn.CreateCommand(); // cmd.CommandText = sql; // if (cmdType==2) // cmd.CommandType = CommandType.StoredProcedure; // return action(cmd); // } //} /// <summary> /// 比如添加一个商品表的同时,相关联的要更新其他表中的商品信息的时候,用这种方法 /// </summary> /// <typeparam name="T">委托类型:要执行的操作当做参数</typeparam> /// <param name="action"></param> /// <returns></returns> public static T ExecuteTrans<T>(Func<IDbCommand, T> action) { using (IDbConnection conn = new SqlConnection(connStr)) { conn.Open(); IDbTransaction trans = conn.BeginTransaction(); IDbCommand cmd = conn.CreateCommand(); cmd.Transaction = trans; return action(cmd); } } /// <summary> /// 构建SqlCommand /// </summary> /// <param name="conn">数据库连接对象</param> /// <param name="sql">SQL语句或存储过程</param> /// <param name="comType">命令字符串的类型</param> /// <param name="trans">事务</param> /// <param name="paras">参数数组</param> /// <returns></returns> private static SqlCommand BuilderCommand(SqlConnection conn, string sql, int cmdType, SqlTransaction trans,params SqlParameter[] paras) { if (conn == null) throw new ArgumentNullException("连接对象不能为空!"); SqlCommand command = new SqlCommand(sql, conn); if (cmdType==2) command.CommandType = CommandType.StoredProcedure; if (conn.State == ConnectionState.Closed) conn.Open(); if (trans != null) command.Transaction = trans; if (paras != null && paras.Length > 0) { command.Parameters.Clear(); command.Parameters.AddRange(paras); } return command; } } }
2,与数据库访问类中有关的事务操作的封装类:
namespace PM.DAL.Helper { /// <summary> /// 事务一系列操作中的一个操作封装类 /// </summary> public class CommandInfo { public string CommandText;//sql或存储过程名 public DbParameter[] Paras; //参数列表 public bool IsProc; //是否是存储过程 public CommandInfo() { } public CommandInfo(string comText, bool isProc) { this.CommandText = comText; this.IsProc = isProc; } public CommandInfo(string sqlText, bool isProc, DbParameter[] para) { this.CommandText = sqlText; this.Paras = para; this.IsProc = isProc; } } }
3,数据库的配置文件
<connectionStrings> <add name ="connStr" connectionString ="server=.;database=RightDBase;uid=sa;pwd=123;" providerName="System.Data.SqlClient"/> </connectionStrings>
四,通用类:字符串通用操作,类型转换等
namespace PM.Common { public static class StringHelper { /// <summary> /// 将数字字符串转换为int /// </summary> /// <param name="strValue"></param> /// <returns></returns> public static int GetInt(this string strValue) { int reInt = 0; int.TryParse(strValue, out reInt); return reInt; } public static decimal GetDecimal(this string strValue) { decimal reInt = 0; decimal.TryParse(strValue, out reInt); return reInt; } public static int GetInt(this object oValue) { int reInt = 0; try { reInt = Convert.ToInt32(oValue); } catch { reInt = 0; } return reInt; } /// <summary> /// 把字符串按照分隔符转换成 List /// </summary> /// <param name="str">源字符串</param> /// <param name="speater">分隔符</param> /// <param name="toLower">是否转换为小写</param> /// <returns></returns> public static List<string> GetStrList(this string str, char speater, bool toLower) { List<string> list = new List<string>(); string[] ss = str.Split(speater); foreach (string s in ss) { if (!string.IsNullOrEmpty(s) && s != speater.ToString()) { string strVal = s; if (toLower) { strVal = s.ToLower(); } list.Add(strVal); } } return list; } /// <summary> /// 把字符串转 按照, 分割 换为数据 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string[] GetStrArray(this string str) { return str.Split(new Char[] { ',' }); } /// <summary> /// 把 List<string> 按照分隔符组装成 string /// </summary> /// <param name="list"></param> /// <param name="speater"></param> /// <returns></returns> public static string GetListStrToString(this List<string> list, string speater) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.Count; i++) { if (i == list.Count - 1) { sb.Append(list[i]); } else { sb.Append(list[i]); sb.Append(speater); } } return sb.ToString(); } /// <summary> /// 得到数组列表以逗号分隔的字符串 /// </summary> /// <param name="list"></param> /// <returns></returns> public static string GetListToStr(this List<int> list) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.Count; i++) { if (i == list.Count - 1) { sb.Append(list[i].ToString()); } else { sb.Append(list[i]); sb.Append(","); } } return sb.ToString(); } /// <summary> /// 得到数组列表以逗号分隔的字符串 /// </summary> /// <param name="list"></param> /// <returns></returns> public static string GetArrayValueStr(this Dictionary<int, int> list) { StringBuilder sb = new StringBuilder(); foreach (KeyValuePair<int, int> kvp in list) { sb.Append(kvp.Value + ","); } if (list.Count > 0) { return DelLastComma(sb.ToString()); } else { return ""; } } #region 删除最后一个字符之后的字符 /// <summary> /// 删除最后结尾的一个逗号 /// </summary> public static string DelLastComma(this string str) { return str.Substring(0, str.LastIndexOf(",")); } /// <summary> /// 删除最后结尾的指定字符后的字符 /// </summary> public static string DelLastChar(this string str, string strchar) { return str.Substring(0, str.LastIndexOf(strchar)); } #endregion /// <summary> /// 把字符串按照指定分隔符装成 List 去除重复 /// </summary> /// <param name="o_str"></param> /// <param name="sepeater"></param> /// <returns></returns> public static List<string> GetSubStringList(string o_str, char sepeater) { List<string> list = new List<string>(); string[] ss = o_str.Split(sepeater); foreach (string s in ss) { if (!string.IsNullOrEmpty(s) && s != sepeater.ToString()) { list.Add(s); } } return list; } #region 得到字符串长度,一个汉字长度为2 /// <summary> /// 得到字符串长度,一个汉字长度为2 /// </summary> /// <param name="inputString">参数字符串</param> /// <returns></returns> public static int StrLength(string inputString) { System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); int tempLen = 0; byte[] s = ascii.GetBytes(inputString); for (int i = 0; i < s.Length; i++) { if ((int)s[i] == 63) tempLen += 2; else tempLen += 1; } return tempLen; } #endregion #region 截取指定长度字符串 /// <summary> /// 截取指定长度字符串 /// </summary> /// <param name="inputString">要处理的字符串</param> /// <param name="len">指定长度</param> /// <returns>返回处理后的字符串</returns> public static string ClipString(string inputString, int len) { bool isShowFix = false; if (len % 2 == 1) { isShowFix = true; len--; } System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); int tempLen = 0; string tempString = ""; byte[] s = ascii.GetBytes(inputString); for (int i = 0; i < s.Length; i++) { if ((int)s[i] == 63) tempLen += 2; else tempLen += 1; try { tempString += inputString.Substring(i, 1); } catch { break; } if (tempLen > len) break; } byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString); if (isShowFix && mybyte.Length > len) tempString += "…"; return tempString; } #endregion public static string StringTrim(this string str) { return str.Trim(); } } }