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

8 篇文章 3 订阅

目录

一、文本数据导入数据库

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值