环境:win7 64位、vs2019、vs2015(mark:不要问我为什么两个VS。。。)
这个是简版哈,只是简单的实现 主要用于看一下框架的逻辑用
后面会慢慢增加功能
项目地址:https://files-cdn.cnblogs.com/files/guxingy/RookeyFrame-%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93-%E5%B7%B2%E5%88%A0%E9%99%A4%E4%BA%86bin%E7%9B%AE%E5%BD%95%E7%AD%89.rar
项目下载下来后,在解决方案上右键,还原NuGet包,然后编译一下就可以了。
代码主要在这两个地方:
测试代码 在这儿
加载 /Home/Index 的时候就会调用 HomeController控制器=>Index(action),然后就会调用我们自己定义的 IsNeedInit 这个方法
/// <summary> /// 是否 需要 初始化数据库 /// </summary> /// <returns></returns> public static bool IsNeedInit() { //是否需要初始化 if (WebConfigHelper.GetAppSettingValue("NeedInit") != "true") { return false; } //获取本地数据库连接对象 DbLinkArgs dbLinkArgs = ModelConfigHelper.GetLocalDbLinkArgs(); if (dbLinkArgs == null) { return true; } //判断数据库是否存在 if (!SystemOperate.DbIsExists(dbLinkArgs)) { //创建数据库 和 写入存储过程 SystemOperate.RegStoredProcedure(); } return false; }
1、主要就是判断数据是否存在,不存在就会在程序中创建一个数据库,然后写入两个存储过程
/// <summary> /// 判断数据库是否存在 /// </summary> /// <param name="dbLinkArgs">数据库连接参数</param> /// <returns></returns> public static bool DbIsExists(DbLinkArgs dbLinkArgs) { if (dbLinkArgs == null) return false; string sql = string.Empty; if (dbLinkArgs.DbType == DatabaseType.MsSqlServer) { //查询 数据库 是否存在 sql = string.Format("SELECT 1 FROM master.sys.sysdatabases WHERE NAME=N'{0}'", dbLinkArgs.DbName); //构造 数据库 连接,连接 master 这个数据库 查询 表是否存在 string connStr = string.Format("Data Source={0};Initial Catalog=master;User ID={1};Password={2};Pooling=true;MAX Pool Size=512;Min Pool Size=50;Connection Lifetime=30", dbLinkArgs.DataSource, dbLinkArgs.UserId, dbLinkArgs.Pwd); //查询数据 object obj = CommonOperate.ExecuteScale(sql, null, connStr, dbLinkArgs.DbType); return obj.ObjToInt() > 0 ? true : false; } return false; }
2、这两个存储过程,一个是分页,另一个是获取单据编码
存储过程我修改过了一下,本来是写在程序里面的,我把它提出来,好看些。写在代码里面太长了,一行一行的
/// <summary> /// 向数据库中注册存储过程 /// </summary> public static void RegStoredProcedure() { DbLinkArgs dbLinkArgs = ModelConfigHelper.GetLocalDbLinkArgs(); //1、创建数据库 //创建 数据库文件 存放目录 string appDataPath = string.Format("{0}App_Data", Globals.GetWebDir()); if (!Directory.Exists(appDataPath)) { Directory.CreateDirectory(appDataPath); } //创建数据库的语句 StringBuilder createDbSb = new StringBuilder(); createDbSb.AppendLine($@"IF NOT EXISTS(SELECT 1 FROM master.sys.sysdatabases WHERE NAME=N'{dbLinkArgs.DbName}') --如果数据库不存在 BEGIN CREATE DATABASE {dbLinkArgs.DbName} ON PRIMARY --创建主数据库文件 ( NAME='{dbLinkArgs.DbName}_data', FILENAME='{appDataPath}{dbLinkArgs.DbName}.mdf', FileGrowth=1MB ) LOG ON --创建日志文件 ( NAME='{dbLinkArgs.DbName}_log', FileName='{appDataPath}{dbLinkArgs.DbName}.ldf', FileGrowth=1MB ) END"); //创建数据库连接地址 连接master数据库 好执行sql语句 string connStr = $"Data Source={dbLinkArgs.DataSource};Initial Catalog=master;User ID={dbLinkArgs.UserId};Password={dbLinkArgs.Pwd};Pooling=true;MAX Pool Size=512;Min Pool Size=50;Connection Lifetime=30"; //执行语句 int rs = CommonOperate.ExecuteNonQuery(createDbSb.ToString(), null, connStr); //2、注入存储过程 //判断存储过程是否存在 Func<string, bool> IsExistProcedure = (procedureName) => { string sql = $"select COUNT(1) from dbo.sysobjects where id=object_id(N'[dbo].[{procedureName}]') and OBJECTPROPERTY(id,N'IsProcedure')=1"; object num_procedure = CommonOperate.ExecuteScale(sql, null, dbLinkArgs.ConnString, dbLinkArgs.DbType); if (num_procedure.ObjToInt() <= 0) { return false;//存储过程 不存在 } return true;//存在 }; //分页 存储过程 if (IsExistProcedure("GetPageTableByRowNumber") == false) { string strSql = File.ReadAllText($"{appDataPath}\存储过程-分页.sql"); CommonOperate.ExecuteNonQuery(strSql, null, dbLinkArgs.ConnString, dbLinkArgs.DbType); } //单据编码 存储过程 if (IsExistProcedure("GetBillCode") == false) { string strSql = File.ReadAllText($"{appDataPath}\存储过程-单据编码.sql"); strSql = strSql.Replace("${Sys_Module}", ModelConfigHelper.GetModuleTableName(typeof(Sys_Module)));//字符串替换 strSql = strSql.Replace("${Sys_BillCodeRule}", ModelConfigHelper.GetModuleTableName(typeof(Sys_BillCodeRule))); CommonOperate.ExecuteNonQuery(strSql, null, dbLinkArgs.ConnString, dbLinkArgs.DbType); } }
SQL语句 和 数据库 存在的位置:
附上SQL语句:
创建数据库
IF NOT EXISTS(SELECT 1 FROM master.sys.sysdatabases WHERE NAME=N'Rookey_Frame3') --如果数据库不存在 BEGIN CREATE DATABASE Rookey_Frame3 ON PRIMARY --创建主数据库文件 ( NAME='Rookey_Frame3_data', FILENAME='D:工作测试项目Rookey.Frame测试项目 RookeyFrame1 初始化数据库 2020-01-10WebApplication3App_DataRookey_Frame3.mdf', FileGrowth=1MB ) LOG ON --创建日志文件 ( NAME='Rookey_Frame3_log', FileName='D:工作测试项目Rookey.Frame测试项目 RookeyFrame1 初始化数据库 2020-01-10WebApplication3App_DataRookey_Frame3.ldf', FileGrowth=1MB ) END
分页
CREATE PROCEDURE [dbo].[GetPageTableByRowNumber] @Field nvarchar(1000), @TableName nvarchar(2000), @condition varchar(max),--格式为:and (查询条件) 如'and (key=value and key1=value1)' @OrderField nvarchar(100), @OrderType int, @pageindx int, @PageSize int, @RecordCount int output --记录的总数 as BEGIN --判断是否有排序字段 if(@OrderField is null or ltrim(rtrim(@OrderField))='') begin RAISERROR('排序字段不能为空',16,1) return end --组装order语句 declare @temp nvarchar(200) set @temp=' order by '+@OrderField if(@OrderType=1) begin set @temp=@temp+' asc ' end else begin set @temp=@temp+' desc ' end --组装查询条件,如果没有查询条件,直接跳过 if(@condition is not null and ltrim(rtrim(@condition))!='') begin set @condition='where 1=1'+@condition end else begin set @condition='' end --求记录的总数 declare @Countsql nvarchar(max) set @Countsql='select @a= count(1) from '+@TableName +' '+@condition exec sp_executesql @Countsql,N'@a int output',@RecordCount output print @RecordCount declare @sql nvarchar(max) --分页 if(@pageindx=1) begin set @sql=' select top '+cast(@pagesize as nvarchar )+' '+ @Field+' from '+@TableName +' '+@condition+' '+@temp end else begin declare @startNumber int set @startNumber =(@pageindx-1)*@pagesize set @sql='select ROW_NUMBER() over('+@temp+') as _number, '+@Field+' from '+@TableName+' '+@condition set @sql='SET ROWCOUNT '+Convert(varchar(4),@PageSize)+'; WITH SP_TABLE AS('+@sql +') SELECT '+@Field+' from SP_TABLE where _number>'+CAST(@startNumber as nvarchar) end print @sql exec(@sql) END
获取单据编码
CREATE PROCEDURE [dbo].[GetBillCode] @ModuleId NVARCHAR(36), @returnChar NVARCHAR(1000) output AS BEGIN DECLARE @TableName nvarchar(255) DECLARE @BillNo nvarchar(255) DECLARE @TempBillNo nvarchar(255) DECLARE @IdentifyExistNo nvarchar(255) DECLARE @IdentifyExistSN nvarchar(255) DECLARE @IdentifyTempSN nvarchar(255) DECLARE @Date DATETIME DECLARE @strSql nvarchar(max) DECLARE @Prefix nvarchar(255) DECLARE @FieldName nvarchar(255) DECLARE @IsEnableDate BIT DECLARE @DateFormat INT DECLARE @SerialNumber INT DECLARE @PlaceHolder INT DECLARE @SNLength INT DECLARE @RuleFormat nvarchar(255) SET @Date=GETDATE() SELECT @TableName=TableName FROM ${Sys_Module} WHERE Id=@ModuleId SELECT @Prefix=Prefix,@IsEnableDate=IsEnableDate,@DateFormat=DateFormat,@SerialNumber=SerialNumber,@PlaceHolder=PlaceHolder,@SNLength=SNLength,@RuleFormat=RuleFormat,@FieldName=FieldName FROM ${Sys_BillCodeRule} WHERE Sys_ModuleId= @ModuleId SET @BillNo=N'' SET @BillNo=@BillNo+@Prefix IF @IsEnableDate=1 BEGIN IF @DateFormat=0 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,12) ELSE IF @DateFormat=1 SET @BillNo=@BillNo+CONVERT(CHAR(4),@Date,112) ELSE IF @DateFormat=2 SET @BillNo=@BillNo+CONVERT(CHAR(4),@Date,12) ELSE IF @DateFormat=3 SET @BillNo=@BillNo+CONVERT(CHAR(6),@Date,112) ELSE IF @DateFormat=4 SET @BillNo=@BillNo+CONVERT(CHAR(6),@Date,12) ELSE IF @DateFormat=5 SET @BillNo=@BillNo+CONVERT(CHAR(8),@Date,112) ELSE IF @DateFormat=6 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,1)+CONVERT(CHAR(2),@Date,12) ELSE IF @DateFormat=7 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,1)+CONVERT(CHAR(4),@Date,112) ELSE IF @DateFormat=8 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,12)+'-'+CONVERT(CHAR(2),@Date,1) ELSE IF @DateFormat=9 SET @BillNo=@BillNo+CONVERT(CHAR(7),@Date,120) ELSE IF @DateFormat=10 SET @BillNo=@BillNo+REPLACE(CONVERT(CHAR(8),@Date,11),'/','-') ELSE IF @DateFormat=11 SET @BillNo=@BillNo+CONVERT(CHAR(10),@Date,120) ELSE IF @DateFormat=12 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,1)+'-'+CONVERT(CHAR(2),@Date,12) ELSE IF @DateFormat=13 SET @BillNo=@BillNo+CONVERT(CHAR(2),@Date,1)+'-'+CONVERT(CHAR(4),@Date,112) ELSE IF @DateFormat=14 SET @BillNo=@BillNo+REPLACE(CONVERT(CHAR(8),@Date,1),'/','-') ELSE IF @DateFormat=15 SET @BillNo=@BillNo+REPLACE(CONVERT(CHAR(10),@Date,101),'/','-') ELSE IF @DateFormat=16 SET @BillNo=@BillNo+CONVERT(CHAR(8),@Date,1) ELSE IF @DateFormat=17 SET @BillNo=@BillNo+CONVERT(CHAR(10),@Date,101) ELSE IF @DateFormat=18 SET @BillNo=@BillNo+CONVERT(CHAR(8),@Date,11) ELSE IF @DateFormat=19 SET @BillNo=@BillNo+CONVERT(CHAR(10),@Date,111) END SET @TempBillNo=@BillNo SET @TempBillNo=@TempBillNo+REPLACE(right(cast(power(10,9) as varchar)+@SerialNumber,@SNLength),'0',@PlaceHolder) SET @strSql=N'' SET @strSql =@strSql+ ' SELECT DISTINCT @IdentifyExistNo='+@FieldName+',@IdentifyExistSN=SUBSTRING('+@FieldName+',LEN('+@FieldName+')-'+CONVERT(NVARCHAR,(@SNLength-1))+',LEN('+@FieldName+'))' SET @strSql =@strSql+ ' FROM '+@TableName SET @strSql =@strSql+ ' WHERE LEN('+@FieldName+')='+CONVERT(NVARCHAR,LEN(@TempBillNo))+' AND '+@FieldName+' LIKE '''+@BillNo+'%''' SET @strSql =@strSql+ ' AND SUBSTRING('+@FieldName+',LEN('+@FieldName+')-'+CONVERT(NVARCHAR,(@SNLength-1))+',LEN('+@FieldName+'))=(SELECT MAX(SUBSTRING('+@FieldName+',LEN('+@FieldName+')-'+CONVERT(NVARCHAR,(@SNLength-1))+',LEN('+@FieldName+'))) FROM '+@TableName+' WHERE LEN('+@FieldName+')='+CONVERT(NVARCHAR,LEN(@TempBillNo)) SET @strSql =@strSql+ ' AND SUBSTRING('+@FieldName+',0,LEN('+@FieldName+')-'+CONVERT(NVARCHAR,(@SNLength-1))+')='''+@BillNo+''''+')' EXEC sys.sp_executesql @strSql,N'@IdentifyExistNo nvarchar(255) output,@IdentifyExistSN nvarchar(255) output',@IdentifyExistNo output,@IdentifyExistSN output IF @IdentifyExistNo<>'' BEGIN SET @IdentifyTempSN= CONVERT(NVARCHAR,CONVERT(DECIMAL,@IdentifyExistSN)+1) IF LEN(@IdentifyTempSN)<@IdentifyTempSN SET @IdentifyTempSN= REPLACE(right(cast(power(10,9) as varchar)+@IdentifyTempSN,@SNLength),'0',@PlaceHolder) SET @returnChar=@BillNo + @IdentifyTempSN END ELSE IF @IdentifyExistNo='' SET @returnChar=@BillNo+ REPLACE(right(cast(power(10,9) as varchar)+@SerialNumber,@SNLength),'0',@PlaceHolder) ELSE IF @IdentifyExistNo IS NULL SET @returnChar=@BillNo+ REPLACE(right(cast(power(10,9) as varchar)+@SerialNumber,@SNLength),'0',@PlaceHolder) END