利用Windows窗体快速/随机的向数据库插入大量数据

     本文属于上课学习笔记,各位大神不喜勿喷哟!!

今天写的这个快速/随机的向数据库插入大量数据的博文的例子是向数据库用户信息表中随机插入上万条信息:

在数据库StuDB中创建学生信息表:

create table TblStudent
(
  intId int primary key identity,
  chvStuName nvarchar(20) not null,--学生名称
  dtmBirthday datetime not null,--出生日期
  chvStuUid nvarchar(18) not null,--身份证号
  chvStuAddress nvarchar(30) not null,--家庭住址
  chvStuPhone nvarchar(11) not null--联系电话

)
go

  创建Windows窗体应用程序的项目:

  

文件夹Files里的三个txt文本分别装的是学生住址与学生的姓与名(后面插入到数据库的数据均是根据这三个文本里的数据随机产生的)

向辅助类DataFactory写入方法

  public class DataFactory
    {
        /// <summary>
        /// 定义数组存放从文件夹Files匹配的学生的家庭住址与姓名
        /// </summary>
        string[] firstNames;
        string[] lastNames;
        string[] shengs;
        string[] shis;

public DataFactory()
        {
            //从文件夹Files里取出数据
            string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files", "FirstName.txt");
            firstNames = System.IO.File.ReadAllText(filePath).Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries);

filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files", "LastName.txt");
            lastNames = System.IO.File.ReadAllText(filePath).Split(new char[]{‘ ‘}, StringSplitOptions.RemoveEmptyEntries);

filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files", "Address.txt");
            string[] allLines = System.IO.File.ReadAllLines(filePath);
            //得到住址中的省
            shengs = allLines.Where(item => item.EndsWith("省")).ToArray();
            //得到住址中的市
            shis = allLines.Where(item => !shengs.Contains(item) && item.Length > 0).ToArray();

}

/// <summary>
        /// 随机向数据库插入大量的数据的方法
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public List<TblStudent> GetStudents(int count)
        {
            //ling to sql连接字符串
            StuDBDataContext dataContext = new StuDBDataContext();
            //学生信息表集合
            List<TblStudent> list = new List<TblStudent>();
            //Random随机数
            Random random = new Random();

//循环向数据库中插入要生成的数据
            while (list.Count<count)
            {
                //根据要生成的数据条数循环随机生成学生信息数据
                for (int i = list.Count; i < count; i++)
                {
                    //实例化学生信息表
                    TblStudent student = new TblStudent();
                    //随机得到学生的姓名
                    student.chvStuName = firstNames[random.Next(0, firstNames.Length)] + lastNames[random.Next(0, lastNames.Length)];

//随机得到学生的身份证号
                    string idcard = "";
                    while (idcard.Length < 18)
                    {
                        idcard += random.Next(0, 10);
                    }
                    student.chvStuUid = idcard;

//随机得到学生的家庭住址
                    student.chvStuAddress = shengs[random.Next(0, shengs.Length)] + shis[random.Next(0, shis.Length)];

//随机得到学生的电话号码
                    string phone = "1";
                    while (phone.Length < 10)
                    {
                        phone += random.Next(0, 10);
                    }
                    student.chvStuPhone = phone;

//随机得到学生的出生日期
                    student.dtmBirthday = DateTime.Parse(random.Next(1950, 2000) + "-" + random.Next(1, 13) + "-" + random.Next(1, 28));
                    list.Add(student);
                }
                /***************判断生成的身份证号不能重复*******************/
                //获取所有生成的身份证号
                string[] allIdCards = list.Select(item=>item.chvStuUid).ToArray();
                //去数据库比对已经存在的身份证号
                var hasIdcards = dataContext.TblStudent.Where(item => allIdCards.Contains(item.chvStuUid)).Select(item => item.chvStuUid).ToArray();

list = list.Where(item => !hasIdcards.Contains(item.chvStuUid)).ToList();

}
            return list;
        }
         
    }

   窗体后台代码:  

namespace BigDataGenerator
{
     
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

public delegate void ChangeUIHandler(int count);
         
        /// <summary>
        /// 插入数据进度条(方法)
        /// </summary>
        /// <param name="progress"></param>
        public void ChangeProgressBar(int progress)
        {
            this.progressBar1.Value = progress;
            this.label2.Text = progress + "%";

}
        //向数据库插入数据成功后button按钮和文本框的值可以使用(方法)
        public void ChangeControlEnabled(int data)
        {
            this.button1.Enabled = true;
            this.textBox1.Enabled = true;

}

//向数据库中插入数据
        private void Generate(object data)
        {
            //更新进度条
            this.Invoke(new ChangeUIHandler(ChangeProgressBar), 0);
            int count = (int)data;
            StuDBDataContext dataContext = new StuDBDataContext();
            //如果用户插入数据库中的数据<100时,就直接向数据库中插入数据
            if (count < 100)
            {
                //向数据库中插入数据
                List<TblStudent> list = new DataFactory().GetStudents(count);
                dataContext.TblStudent.InsertAllOnSubmit(list);
                dataContext.SubmitChanges();
                //更新进度条
                this.Invoke(new ChangeUIHandler(ChangeProgressBar), 100);
            }
            //如果用户插入数据库中的数据>=100时,为了电脑不会卡死,就用线程执行
            else
            {
                int countPerTime = 100;
                int times = (int)Math.Ceiling(count * 1.0 / countPerTime);

for (int i = 1; i <= times; i++)
                {
                    List<TblStudent> list = new DataFactory().GetStudents(countPerTime);
                    if (i == times)
                    {
                        list = new DataFactory().GetStudents(countPerTime + (count - (countPerTime * (i-1))));
                    }
                    //向数据库中插入数据
                    dataContext.TblStudent.InsertAllOnSubmit(list);
                    dataContext.SubmitChanges();

//更新进度条(线程安全,progressBar是由UI线程创建,而当前代码是被新创建的线程执行的,所以是不安全的.)

int progress = (int)((i * 1.0 / times) * 100);

this.Invoke(new ChangeUIHandler(ChangeProgressBar), progress);

}

}
            //更新进度条(恢复成默认状态0%)
            this.Invoke(new ChangeUIHandler(ChangeControlEnabled), 0);

}

private void button1_Click(object sender, EventArgs e)
        {
            int count = int.Parse(this.textBox1.Text.Trim());
            Thread thread = new Thread(new ParameterizedThreadStart(Generate));
            thread.Start(count);
            //向数据库插入数据成功前button按钮和文本框的值不可以使用
            this.button1.Enabled = false;
            this.textBox1.Enabled = false;

}
    }
}

  运行效果:  

时间: 2024-10-08 03:31:21

利用Windows窗体快速/随机的向数据库插入大量数据的相关文章

最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码

Windows窗体DataGridView控件的性能调优.net 4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避免一些这方面的开销,避免内存成本高的特性. 你也可以管理的部分或全部数据维护和检索任务自己使用虚拟模式为了定制的内存使用情况. 在这一节中 最佳实践扩展Windows窗体DataGridView控件 描述如何使用 DataGridView 控制,避免了不必要的内存使用和在处理大量数据时的性能损失. 虚拟

性能调优的Windows窗体DataGridView控件

性能调优的Windows窗体DataGridView控件 . 净框架4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避免一些这方面的开销,避免内存成本高的特性. 你也可以管理的部分或全部数据维护和检索任务自己使用虚拟模式为了定制的内存使用情况. 在这一节中 最佳实践扩展Windows窗体DataGridView控件 描述如何使用 DataGridView 控制,避免了不必要的内存使用和在处理大量数据时的性能损失. 虚

mysql/mariadb数据库在插入表数据时,ID竟然成奇数增加了?看完下面内容就知道怎么处理了。

今天突然被问到一个问题,mysql数据库插入表数据时,设置了ID自增,但是插入数据后,ID却呈奇数增加,不是123456类型,而是13579形式,突然有点懵,研究了一会,发现是auto_increment步长的问题,下面就具体来说下怎么解决: 插入数据后发生表内ID按奇数增加,如下图: 查看自增步长:show variables like 'auto_increment%'; 将自增步长改为1:set @@auto_increment_increment=1; 此时用truncate清空表数据重

Windows 窗体的.Net 框架绘图技术

当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等操作是不需要特别加以考虑的.这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关联的代码然后在IDE中按F5,一个完完全全的窗体程序就诞生了!所有控件都将自己绘制自己,窗体或者控件的大小和缩放都调整自如.在这里经常会用到的,且需要引起一点注意的就是控件效果.游戏,自定义图表控件以及屏幕保护程序的编写会需要程序员额外撰写用于响应 Paint 事件的代码. 本文针对那些Wind

青铜到王者,快速提升你 MySQL 数据库的段位!

新的一周,老张(superZS)再次与大家见面,我们又要面临快速的生活节奏而令人厌恶的工作!现在大多数人选择放松自己的方式就是玩游戏,最为突出的可能就要属手游"王者荣耀". 据说这款游戏上到70旬老者,下至小学生都玩,老张我也玩.段位低得可怜(PS:最近刚玩哈),刚刚白银. 当时也想让别人带带我,说你只要给多少钱,就能快速带你从倔强青铜到最强王者,但最后我在装逼和省钱的抉择上,我选择了省钱.我心想就玩一个游戏,无非你就是比我玩的时间长,有技巧,有经验嘛,但凡我多花点时间,绝对比你玩的好

如何利用微软本身的库做个数据库客户端的配置

做C/S的朋友一般都有个窗体,用来配置应用的数据库连接语句,那这个窗体我们是自己写好呢还是调用微软现有的,当然这是智者见智,仁者见仁的问题,下面将简单介绍如何利用微软现有的来实现这么一个窗体. 首先我们需要在解决方案中引入如下三个库: 接下来事情会简单到出乎你意料之外,在我们需要打开窗体配置的地方写上如下代码: 1 DataConnectionDialog dialog = new DataConnectionDialog(); 2 //添加数据源列表,可以向窗口中添加自己程序所需要的数据源类型

用于列出选项的Windows窗体控件

可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListBox用于显示项列表,用户可以从中选择一项或多项.如果项目总数超出可以显式的项目数,则ListBox会自动添加滚动条.当MultiColumn属性为true时,列表框以多列形式显示条目,并且会出现一个水平滚动条.当MultiColumn为false时,列表框以单列形式显示条目,并且会出现一个垂直滚动条

实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624.aspx  译 Q:77811970 实现虚拟模式的原因之一 DataGridView控制只检索数据,因为它是必要的. 这就是所谓的 即时数据加载 . 如果你正在与一个非常大的表在一个远程数据库,例如,您可能希望避免启动延迟,只检索所需的数据显示和检索额外的数据只有当用户新行滚动到视图. 如果客户

API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别

[原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface.Windows操作系统提供给应用程序编程的接口, 简称 为API函数. Win32 SDK:SDK(Software Development Kit)中文是软件开发包.则Win32 SDK是Windows 32位平台下的软件开发包,包括了API函数.帮助文档.微软 提供的一些辅助开发工具. Win3