突发奇想 之 古玩中的代码

来源:互联网 发布:专业英语在线翻译软件 编辑:程序博客网 时间:2024/04/27 17:54


这是一个早以前的想法了 大概在几个月之前 只是一直没有时间来实现。

我喜欢古玩 说白了就是古董 每次看中央二套的《鉴宝》栏目 
每次当主持人说“有请下一位持宝人上场” 的时候 大屏幕上会随机的滚动所有在场的持宝人有中宝物的照片
主持人喊“停” 大屏幕停止滚动 所显示的宝物就是下面要上场的宝物了 最后专家团来为这件宝物鉴定真伪
当时看到这个功能的时候 我的第一反应是利用了随机函数 于是就想抽时间来模拟实现这个功能 但是一直犹豫种种原因
没有来实现 今天下午突然想起了这件事 说做就做。。。

我第一开始的想法是这样的
1.把要显示的宝物图片放在一个指定的文件夹中
2.然后利用 Directory.GetFileSystemEntries(); 方法 遍历 将文件夹中的图片存在数据库中
3.每次程序开始的时候 先获得数据的总条数 然后在这个总条数的范围内 获得随机数作为ID
4.再利用随机数ID 查到对应的数据 显示出来

照着这个步骤做下来 我发现了好几个问题 其中的问题有
1.如果id是不连续的 这下就悲剧了
2.程序在一开始的时候一个操作是 先清空数据表中所有的数据 然后再遍历文件夹 重新添加图片信息 这样是为了对图片操作了以后
得到最新的图片数据  如果这样每次获得ID的最大值和最小值访问数据库次数太多 程序运行太慢
3.每次要获得数据的总个数 也要访问数据库 这样也会造成程序运行过慢

根据以上几个方面的问题 我对程序做了一下修改
1.把要显示的宝物图片放在一个指定的文件夹中
2.然后利用 Directory.GetFileSystemEntries(); 方法 遍历 将文件夹中的图片存在数据库中
3.每次程序开始的时候 只访问一次数据库 将数据库中的内容放在实体对象中 再将对象放在List中 返回List
4.获得List的长度 作为数据的总个数 然后在这个范围内取随机数 
5.最后 根据产生的随机数作为List的下标 来访问对应的数据


改进以后 运行的速度明显提高了不少 用户体验提升了不说 内存也优化了不少 真是一举两得呀!!

下面我来说一下我的数据表是怎么设计的吧
ID:我觉得这个字段我就不用说的太多了 说多了也是废话 identity(1,1) primary key
PicPath:这个字段用来保存宝物图片的相对路径(说的是exe程序的相对路径)
PicName:这个字段用来保存宝物的名称 比如说“元代青花瓷花瓶”等
GetBabyPersonName:这个字段用来保存这个宝物的所有者 也就是“持宝人”的称呼

(ps:我见过不少用拼音首字母来命名的字段名   DLXX你知道是什么意思么? 是登陆信息! 天呐 鬼知道原作者是什么意思)




说了思路 说了设计表的设计 现在就该上源代码了吧

别急 我还想补充语句  这个系统我是利用三层模式实现的 听不少人说小程序就不要使用“三层”了 直接访问数据库就得了
我觉得 各有各的好处 在不同的业务中 使用不同的方法 只不过用了“三层” 程序的层次感会强一些

好了 不说了 上源码(只上传UI层的代码和SQL脚本)

publicpartialclass Form1 : Form

    {

        BLLbll = new BLL();

        PicTabletable = new PicTable();

 

        // 存放数据的总个数

        intcount = 0;

 

        // 保存点击了"开始"还是"结束"的状态

        intflag = 0;

        List<PicTable> lis =newList<PicTable>();

 

        ///<summary>

        ///程序初始化

        ///</summary>

        publicForm1()

        {

            InitializeComponent();

 

           // 先清空表中所有的数据

            bll.DeleteALL();

 

           // 将图片添加到数据库中

            AddDataBase();

 

           // 获得所有的数据将数据放在list集合中

            lis = bll.GetAllData();

 

           // 获得数据的总条数

            count = lis.Count;

        }

 

        ///<summary>

        ///点击开始或者结束

        ///</summary>

        ///<paramname="sender"></param>

        ///<paramname="e"></param>

        privatevoid btnBigin_Click(objectsender,EventArgs e)

        {

           if(flag==0)

            {

                timer.Start();

                btnBigin.Text ="停止";

                flag =1;

            }

           else

            {

                timer.Stop();

                btnBigin.Text ="开始";

                flag =0;

            }

        }

 

        ///<summary>

        ///计数器不停调用

        ///</summary>

        public void GetRandNumber()

        {

           // 产生一个在总数据范围内的随机数

           Randomr = new Random();

           intrandomNum = r.Next(0, count );

          

           // 宝物名称

            labBabyName.Text =lis[randomNum].PicName;

 

           // 宝物图片展示

            picRes.ImageLocation =lis[randomNum].PicPath;

 

           // 持宝人姓名

            labGetBabyName.Text =lis[randomNum].GetBabyPersonName;

        }

 

        ///<summary>

        ///计数器调用

        ///</summary>

        ///<paramname="sender"></param>

        ///<paramname="e"></param>

        privatevoid timer_Tick(objectsender,EventArgs e)

        {

            GetRandNumber();

        }

 

        ///<summary>

        ///将图片保存到数据库

        ///</summary>

        public void AddDataBase()

        {

           // 得到pic中的文件读取pic中的所有数据

           string[]pics = Directory.GetFileSystemEntries(@"pic");

 

           // 遍历路径取出各个数据并保存在数据库中

           for(int i =0;i < pics.Length; i++)

            {

               string[]tempPath = pics[i].Split('\\','_','.',' ');

 

               // 图片的相对路径

                table.PicPath = pics[i];

               // 将路径中的宝物名称提取出来

                table.PicName = tempPath[1];

               // 将路径中的持宝人姓名提取出来

                table.GetBabyPersonName =tempPath[2];

 

               // 保存在数据库中

                bll.Add(table);

            }

        }

    }

 



SQL脚本

createtablePicTable

(

   id intidentity(1,1)primarykey,

   PicPath nvarchar(100),

   PicName nvarchar(50),

   GetBabyPersonName nvarchar(10)

)



界面截图

抽取前初始化


抽取宝物中。。。


抽取宝物后


原创粉丝点击