zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU1251 统计难题
    字典树模板
    HDU5536 Chip Factory(01字典树)
    函数的返回值
    函数的使用原则
    文件修改
    函数
    文件内指针移动
    文件操作模式
    字符编码
  • 原文地址:https://www.cnblogs.com/guxingy/p/12172498.html
Copyright © 2011-2022 走看看