RookeyFrame 初始化数据库 简版

环境: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
原文地址:https://www.cnblogs.com/guxingy/p/12172498.html