zoukankan      html  css  js  c++  java
  • .net+mssql制作抽奖程序思路及源码

    近期一直在研究数据库,刚好有个项目要做抽奖程序,恩,拿来练练手吧。

    抽奖程序:

    思路整理,无非就是点一个按钮,然后一个图片旋转一会就出来个结果就行了,可这个程序的要求不是这样的,是需要从数据库中随机抽取用户,根据数据库中指定的等级和人数,一键全部抽出来结果就行了。同时需要存储到数据库。还需要一个导出的功能。

    不能遗漏的是,如果通过随机数根据id来抽取的话,需要考虑id不连续的问题,如果全部取出id也不现实。尽量少的去读写数据库。

    数据库:

    CREATE TABLE [dbo].[users](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [name] [nvarchar](50) NOT NULL,
        [phone] [nvarchar](50) NULL,
     CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[result](
     [id] [int] IDENTITY(1,1) NOT NULL,
     [usersid] [int] NOT NULL,
     [awardsid] [int] NOT NULL,
     CONSTRAINT [PK_result] PRIMARY KEY CLUSTERED 
    (
     [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[awards](
     [id] [int] IDENTITY(1,1) NOT NULL,
     [Name] [nvarchar](50) NOT NULL,
     [Number] [int] NOT NULL,
     CONSTRAINT [PK_awards] PRIMARY KEY CLUSTERED 
    (
     [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    CREATE VIEW [dbo].[view1]
    AS
    SELECT     dbo.result.id AS resultid, dbo.users.id, dbo.users.name, dbo.users.phone, dbo.awards.Name AS awardname
    FROM         dbo.awards INNER JOIN
                          dbo.result ON dbo.awards.id = dbo.result.awardsid INNER JOIN
                          dbo.users ON dbo.result.usersid = dbo.users.id
    CREATE PROCEDURE [dbo].[getranddata] 
    --这个地方的参数是后台调用传的参数,两个变量之间需要“,”号分开
    @count int, --剩余奖项大小
    @awards int --奖项的id
    AS BEGIN 
    --这个地方定义的参数是存储过程内部用到的
    DECLARE @minid int --最大id
    DECLARE @maxid int --最小id
    DECLARE @randnum int --随机数临时变量
    DECLARE @exist int --查询结果
    SET @minid =
      (SELECT top 1 id
       FROM users
       ORDER BY id ASC) --查询最小id
    SET @maxid =
      (SELECT top 1 id
       FROM users
       ORDER BY id DESC) --查询最大id
    --set @count = 100
    --set @awards = 1
    --嵌套语句begin开始,end结束
    while @count>0 BEGIN
    SELECT @randnum = ROUND(((@maxid - @minid -1) * RAND() + @minid), 0)
    SET @exist =
      (SELECT count(*)
       FROM users
       WHERE id=@randnum) IF @exist = 1 BEGIN
    INSERT INTO result(usersid,awardsid)
    VALUES(@randnum,
           @awards)
    SET @count = @count - 1 END END END

    其中三张表,一个视图,一个存储过程。

    后台代码:

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection sqlcon = new SqlConnection("server=.;database=test;uid=sa;pwd=123");
        sqlcon.Open();
        SqlDataAdapter sqlsda = new SqlDataAdapter("select * from awards", sqlcon);
        ds = new DataSet();
        sqlsda.Fill(ds);
        DataTable dt = ds.Tables[0].Copy();
        ds.Clear();
        int count = dt.Rows.Count;
        for (int i = 0; i < count; i++)
        {
            SqlCommand sqlcmd = new SqlCommand("getranddata", sqlcon);
            SqlParameter pcount = new SqlParameter("@count", Convert.ToInt32(dt.Rows[i]["Number"]));
            SqlParameter pawards = new SqlParameter("@awards", Convert.ToInt32(dt.Rows[i]["id"]));
            sqlcmd.Parameters.Add(pcount);
            sqlcmd.Parameters.Add(pawards);
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.ExecuteNonQuery();
            sqlsda = new SqlDataAdapter("select top " + Convert.ToInt32(dt.Rows[i]["Number"]) + " * from view1 order by resultid desc", sqlcon);
            sqlsda.Fill(ds, "t" + i.ToString());
            switch (i)
            {
            case 0:
                GridView1.DataSource = ds.Tables["t" + i.ToString()].Copy().DefaultView;
                GridView1.DataBind();
                break;
            case 1:
                GridView2.DataSource = ds.Tables["t" + i.ToString()].Copy().DefaultView;
                GridView2.DataBind();
                break;
            case 2:
                GridView3.DataSource = ds.Tables["t" + i.ToString()].Copy().DefaultView;
                GridView3.DataBind();
                break;
            default:
                break;
            }
        }
        sqlcon.Close();
    }

    奖项设置:

    抽奖结果:

    =================================================================

    知识点:

    SQL - 生成指定范围内的随机数

    DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT
    SET @Lower = 1
    SET @Upper = 10
    SELECT @Result = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
    SELECT @Result

    ROUND()函数:返回按指定位数进行四舍五入的数值。

    RAND()函数:生成随机数。

    SQL循环语句嵌套

    DECLARE @i int
    SET @i=1 while @i<8 BEGIN IF @i<5 print space(4-@i)+REPLICATE('*',2*@i-1) ELSE print space(@i-4)+REPLICATE('*',15-2*@i)
    SET @i=@i + 1 END
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/gc2013/p/3790817.html
Copyright © 2011-2022 走看看