IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> C#数据库教程6-ADO.NET用户数据导入数据库的几种类型 -> 正文阅读

[大数据]C#数据库教程6-ADO.NET用户数据导入数据库的几种类型

目录

一、文本数据导入数据库

1、创建txt文本用户数据

2、创建数据表

3、创建Winform界面程序

4、添加按钮程序

5、测试

二、省市县联动数据查询

1、数据库中创建省市县三级行政单位

2、创建C# WPF工程

3、测试

?三、手机号码归属地查询

1、手机号文本文件

?2、创建数据表

?3、创建C#程序工程

版本1

?版本2

版本3:SqlBulkCopy

工程下载连接


一、文本数据导入数据库

1、创建txt文本用户数据

文本格式为UTF-8格式,设置方式在文件、另存为、选择UTF-8即可

2、创建数据表

数据库中创建表:T_Customer

3、创建Winform界面程序

4、添加按钮程序

        private void btnOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "All files(*.*)|*.*|文本文件(*.csv)|*.csv|文本文件(*.txt)|*.txt";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            string fileName = ofd.FileName;
            //File.ReadLines是把文件一次读取到string集合中
            //如果需要读取很大的文件使用FileStream
            //IEnumerable<string> lines = File.ReadLines(fileName);                     //如果不是UTF-8格式的话,读取出来的数据可能乱码
            IEnumerable<string> lines = File.ReadLines(fileName,Encoding.Default);      //
            foreach(string line in lines)
            {
                string[] segs = line.Split(';');        //分割字符串
                string name = segs[0];
                string age = segs[1];
                string sex = segs[2];

                SqlHelper.ExecuteNonQuery("insert into T_Customer(Name,Age,Sex) values (@name,@age,@sex)",
                    new SqlParameter("@name", name),
                    new SqlParameter("@age", Convert.ToInt32(age)),
                    new SqlParameter("@sex", sex)
                    );                
            }
            MessageBox.Show("数据导入成功!共:"+lines.Count().ToString()+"条数据。");
        }

5、测试

二、省市县联动数据查询

1、数据库中创建省市县三级行政单位

省市县数据库SQL语句文件

链接:https://pan.baidu.com/s/19_9SHIZ8Ey7JItDHdt41ng?
提取码:kfrr

?语句说明

AreaFull:数据表名称

AreaId:主键

AreaName:地名

AreaPid:父节点

AreaPid为0则表示省一级行政单位。

将txt文本内容中SQL语句复制,然后在数据库中新建查询、粘贴复制的SQL语言,再执行SQL语句

?刷新数据库,查看写入的数据

2、创建C# WPF工程

创建类Area

    class Area
    {
        public int AreaID { get; set; }
        public string AreaName { get; set; }
    }

在XML中添加三个listbox控件,分别为省市县列表。分别添加事件程序:

Window_Loaded

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //DataTable table = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid=@areaPid",
            //    new SqlParameter("@areaPid",0));    //读取AreaPid等于0的项
            DataTable table = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid=0"); //读取AreaPid等于0的项
            List<Area> listPrive = new List<Area>();    //创建list省集合
            foreach (DataRow row in table.Rows)
            {
                Area area = new Area();
                area.AreaID = (int)row["AreaID"];
                area.AreaName = (string)row["AreaName"];
                listPrive.Add(area);
            }
            lbPrive.ItemsSource = listPrive;
        }

lbPrive_SelectionChanged

        private void lbPrive_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //获得选中省的对象
            Area area = (Area)lbPrive.SelectedItem;
            //获得所有AreaPid等于选中省的AreaID的值,也就是省的下属市
            DataTable dtCity = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid=@Pid",
                new SqlParameter("@Pid", area.AreaID));
            List<Area> listCity = new List<Area>();
            foreach (DataRow row in dtCity.Rows)
            {
                Area areaCity = new Area();
                areaCity.AreaID = (int)row["AreaID"];
                areaCity.AreaName = (string)row["AreaName"];
                listCity.Add(areaCity);
            }
            lbCity.ItemsSource = listCity;
        }

lbCity_SelectionChanged

        private void lbCity_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if(lbCity.SelectedItem!=null)
            {
                Area area = (Area)lbCity.SelectedItem;
                DataTable dtCount = SqlHelper.ExecuteDataTable("select * from AreaFull where AreaPid=@CountPid",
                   new SqlParameter("@CountPid", area.AreaID));
                List<Area> listCount = new List<Area>();
                foreach (DataRow row in dtCount.Rows)
                {
                    Area areaCount = new Area();
                    areaCount.AreaID = (int)row["AreaID"];
                    areaCount.AreaName = (string)row["AreaName"];
                    listCount.Add(areaCount);
                }
                lbCount.ItemsSource = listCount;
            }
        }

3、测试

?

?三、手机号码归属地查询

1、手机号文本文件

链接:https://pan.baidu.com/s/18VmJfOrNzxSryDblLW9YXA?
提取码:i1ln

?2、创建数据表

在数据库中创建数据表:T_TelNum

?3、创建C#程序工程

版本1

普通写法1(速度比较慢),原因是打开一次数据库、写入一条数据、然后关闭数据库,然后再重新打开数据库、写入数据、再关闭数据库。频繁的打开数据库和关闭数据库造成读写缓慢。

代码

        private void btnTelNumImport_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文件|*.txt";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            //IEnumerable<string> lines=File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
            string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
            txtAll.Text = lines.Length.ToString();
            for (int i = 1; i < lines.Count(); i++) //第一行列头不用
            {
                string line = lines[i];
                string[] str = line.Split('\t');    //Tab 制表符
                string startTelNum = str[0];        //手机号前7位
                string city = str[1];               //手机号归属地
                city = city.Trim('"');              //去掉两边双引号
                string telType = str[2];            //手机号运营商
                telType = telType.Trim('"');        //sql语句前面加@  表示 语句可以换行
                SqlHelper.ExecuteNonQuery(@"insert into T_TelNum(StartTelNum,TelType,TelArea)   
                                            values(@StartTelNum,@TelType,@TelArea)",
                    new SqlParameter("@StartTelNum", startTelNum),
                    new SqlParameter("@TelType", telType),
                    new SqlParameter("@TelArea", city)
                    );

                txtProgress.Text = i.ToString();
            }
            MessageBox.Show("导入成功");
        }

运行程序

?

打开文件开始往数据库中写数据,由于是在界面线程中执行因此界面直接卡死,并且时间很长也没有结束。使用断点调试进入程序内部,发现总数是258114、在运行两分钟时间才写入24152条。

?在数据库中观察发现已经有数据写入

?版本2

普通写法2(速度比较慢),原因是虽然在程序中的写法只打开一次、然后不停的往数据库中写数据、待全部数据写完再关闭数据库,但是微软在ADO.NET中已经针对SqlCommand底层语句设置了执行一次就关闭

代码

        private void btnTelNumImport2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文件|*.txt";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            //IEnumerable<string> lines=File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
            string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
            txtAll.Text = lines.Length.ToString();

            DateTime startTime = DateTime.Now;

            string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();

                for (int i = 0; i < lines.Length; i++)
                {
                    string line = lines[i];
                    string[] strs = line.Split('\t');
                    string startTelNum = strs[0];
                    string city = strs[1];
                    city = city.Trim('"');
                    string telType = strs[2];
                    telType = telType.Trim('"');
                    //数据库连接池:ADO.NET会尽可能的复用连接池中的连接
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        //sql语句前面使用@,后面可以换行
                        cmd.CommandText = @"insert into T_TelNum(StartTelNum,TelType,TelArea) 
                                                    values (@StartTelNum,@TelType,@TelArea)";
                        cmd.Parameters.Add(new SqlParameter("@StartTelNum", startTelNum));
                        cmd.Parameters.Add(new SqlParameter("@TelType", telType));
                        cmd.Parameters.Add(new SqlParameter("@TelArea", city));
                        
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (Exception ce)
                        {
                            MessageBox.Show(ce.Message);
                        }
                    }
                    //MessageBox.Show("成功 插入第一行");
                    TimeSpan ts = DateTime.Now - startTime;//DateTime获得TimeSpan类型
                    //s.TotalSeconds 时间段代码的总秒数
                    double ellapSedSec = ts.TotalSeconds;
                    double totalSec = (ellapSedSec / (i + 1)) * lines.Length;
                }
            }
        }

运行

?程序运行一会,然后使用断点调试。看到总共需要1827秒钟得时间才能将数据全部写完。

?

版本3:SqlBulkCopy

使用SqlBulkCopy(速度极快)

代码

        private void btnTelNumImport3_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "文本文件|*.txt";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();

            DateTime startTime = DateTime.Now;

            DataTable table = new DataTable();    //建表,内存中的表,把所有数据导入该表,然后将该表数据一起导入到数据库中
            table.Columns.Add("StartTelNum");
            table.Columns.Add("TelCity");
            table.Columns.Add("TelType");
            for (int i = 0; i < lines.Length; i++)
            {
                string line = lines[i];
                string[] strs = line.Split('\t');
                string startTelNum = strs[0];
                string city = strs[1];
                city = city.Trim('"');
                string telType = strs[2];
                telType = telType.Trim('"');

                DataRow row = table.NewRow(); //创建一个DataRow对象
                row["StartTelNum"] = startTelNum; //一定要在一开始创建Tables.Columns添加列,否则会报错
                row["TelCity"] = city;
                row["TelType"] = telType;
                table.Rows.Add(row);    //NewRow只是创建,没有插入
            }

            string connStr = ConfigurationManager.ConnectionStrings["dbConnStr"].ConnectionString;
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connStr))
            {
                bulkCopy.DestinationTableName = "T_TelNum";
                //添加DataTable列名和数据库表中列名的映射。第一个参数是DataTable列名、第二个是数据库列名
                bulkCopy.ColumnMappings.Add("StartTelNum", "StartTelNum");
                bulkCopy.ColumnMappings.Add("TelType", "TelType");
                bulkCopy.ColumnMappings.Add("TelCity", "TelArea");                
                bulkCopy.WriteToServer(table);

            }
            TimeSpan ts = DateTime.Now - startTime;//DateTime获得TimeSpan类型           
            MessageBox.Show("写入数据完成,所用的时间:" + ts.ToString());
        }

测试

先把上面导入得数据删除

delete from T_TelNum

?运行程序

?写入全部数据只需要5.9秒钟

?

?

工程下载连接

https://download.csdn.net/download/panjinliang066333/85328072

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:58:25  更:2022-05-10 12:00:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:32:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码