目录
一、文本数据导入数据库
1、创建txt文本用户数据
2、创建数据表
3、创建Winform界面程序
4、添加按钮程序
5、测试
二、省市县联动数据查询
1、数据库中创建省市县三级行政单位
2、创建C# WPF工程
3、测试
三、手机号码归属地查询
1、手机号文本文件
2、创建数据表
3、创建C#程序工程
版本1
版本2
版本3:SqlBulkCopy
工程下载连接
文本格式为UTF-8格式,设置方式在文件、另存为、选择UTF-8即可
数据库中创建表:T_Customer
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 lines = File.ReadLines(fileName); //如果不是UTF-8格式的话,读取出来的数据可能乱码
IEnumerable 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()+"条数据。");
}
省市县数据库SQL语句文件
链接:https://pan.baidu.com/s/19_9SHIZ8Ey7JItDHdt41ng
提取码:kfrr
语句说明
AreaFull:数据表名称
AreaId:主键
AreaName:地名
AreaPid:父节点
AreaPid为0则表示省一级行政单位。
将txt文本内容中SQL语句复制,然后在数据库中新建查询、粘贴复制的SQL语言,再执行SQL语句
刷新数据库,查看写入的数据
创建类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 listPrive = new List(); //创建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 listCity = new List();
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 listCount = new List();
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;
}
}
链接:https://pan.baidu.com/s/18VmJfOrNzxSryDblLW9YXA
提取码:i1ln
在数据库中创建数据表:T_TelNum
普通写法1(速度比较慢),原因是打开一次数据库、写入一条数据、然后关闭数据库,然后再重新打开数据库、写入数据、再关闭数据库。频繁的打开数据库和关闭数据库造成读写缓慢。
代码
private void btnTelNumImport_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt";
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
//IEnumerable 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(速度比较慢),原因是虽然在程序中的写法只打开一次、然后不停的往数据库中写数据、待全部数据写完再关闭数据库,但是微软在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 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秒钟得时间才能将数据全部写完。
使用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