(ADO.NET小知识点汇总)看到什么记什么
1、数据库连接池:在同时连接数不多的情况下,
打开一个链接往数据库导1W条数据的耗时
跟
导一条数据就打开跟关闭数据库连接的耗时
两者其实相差不大,这是为什么呢?打开关闭的本身不是有很多耗时吗?这是因为数据库连接池的存在
当你同时连接数打开的不多的情况下,你关闭一个链接,实际上,这个链接并没有关闭,而是被.Net偷偷藏起来,当然这个藏起来的链接数数量
是有限定的,所以当你导一条,打开关闭一个链接这种方式导数据时,其实并未真正在“打开关闭连接”。
2、批量数据提交:SqlBulkCopy类 以读取号码归属地这样一个文本为例
首先是把数据读取进来,放到一个本地大集合DataTable中,然后再把这个table扔到数据库中
DataTable table = new DataTable();
table.Columns.Add("TelNum");//自己定义的table里面的列名,任意取
table.Columns.Add("City");
table.Columns.Add("TelType");
for(int i = 0;i < lines.Length; i ++)//lines是已经从打开的文本中读取到的集合,一行为单位
{
//获取需要往数据库填的字符串
string line = lines[i];
string[] strs = line.Split('/t');//VS里'/t'为制表符 以制表符来分割
string telNum = strs[0];
string city = strs[1].Trim('"');//去掉两边的双引号 :"北京市"
string telType = strs[2].Trim('"');
//然后把数据填充到DataTable中,不过这里需要用到DataRow对象
DataRow row = table.NewRow();
row["TelNum"] = telNum ;//一定要在一开始创建table.Columns添加列
row["City"] = city ;
row["TelType"] = telType ;
//然后把Row跟Table关联起来
table.Rows.Add(row);
}
//以上操作已经把从文本读到的数据填充到了DataTable中,接下来该把表扔到数据库里了
using(SqlBulkCopy bulk = new SqlBulkCopy(ConnStr))
{
bulk.DestinationTableName = "T_TelNum";//数据库中存数据的表名
//第一个参数是DataTable中自己定义的列名,第二个参数是数据库表中定义的列名,
//两个表的列关联起来 (映射!)
bulk.ColumnMappings.Add("TelNum","TelNum");
bulk.ColumnMappings.Add("City","TelArea");
bulk.ColumnMappings.Add("TelType","TelType");
bulk.WriteToServer(table);//前期工作做完,把DataTable扔到数据库中。
}
不用这个类,20分钟。用这个类9秒钟~~~~~~~醉醉哒
个人理解:先把数据填到本地数据集DataTable,这样都在本地进行,只是读取字符串,然后一次性的把数据扔到数据库。
而直接把数据一条条读到数据库中,其中涉及的内部操作,代码量显然是巨大的。
两者的数据量相同,所以我认为,时间相差这么多,是花在与数据库相互中产生的大量代码量。(也不知道这么说合不合适,给自己看的- -)
3、数据库中查询为属性为Null的数据。
select * from T_table1 where Name = Null 这样结果是什么都没有,这样是不行的,Null表示不知道,所以不能说两个“不知道” 可以用 = 相连
应用:
select * from T_table1 where Name is Null
所以在ADO.NET中如何在有数据要求为Null时插入数据,文本框(textbox)未填值时,默认为"",而不是null,直接给文本框赋值为null也不行,ADO.NET 会报错,所以这里 用到一个类:DBNull。DBNull.Value用来表示数据库中的Null
有一点要注意,由于DBNull.Value的类型是一个类,所以不能直接转换成字符串,可以将其赋值给Object对象。
4、Model,当一个方法中可能要用到很多参数,可以考虑给这些参数建一个Model,即一个类,里面全是属性,然后要用到这些参数的时候,直接把这个类当做 参数传入,在方法里面再给这些属性赋值,从而调用。
注意:对于不可空(null)类型,如果数据库定义可空或者有可能为null时,属性定义的时候要加上? 如 int? Age{get; set;}
5、三层架构,(只学到把数据访问层分离开来)
之前都是直接在界面(UI)中写SQL,对于大的项目这样做很难维护,而且复用性不强。三层架构是企业开发中常用的设计模式,把数据库访问、业务逻辑、界面分离。
业务逻辑层(BLL) 有关逻辑判断语句。
数据访问层DAL (Data Access Layer) 封装方法,有关数据库的所有语句封装在这里面。包括对SQLHelper 的调用
界面(UI)
原则:UI中不出现SQL
编写Model(注意可空字段要考虑?(可null)的问题)数据库中定义的可空值
DAL常用封装:ToModel、ListAll(对于大数据量的数据不要提供,而是提供条件搜索)、
GetById、DeleteById、Update、AddNew
6、
string sqlstr = @"update T_management set number = @number,Admin = @Admin,Password = @Password where number = @number";
SQLiteHelper.ExecuteNonQuery(sqlstr, new SQLiteParameter("@number", SQLiteHelper.IsNull(m.number, "number")),
new SQLiteParameter("@Admin", SQLiteHelper.IsNull(m.Admin, "Admin")),
new SQLiteParameter("@Password", SQLiteHelper.IsNull(m.Password, "Password")));
//new SQLiteParameter("@number", SQLiteHelper.IsNull(m.number, "number"))
//@number有两个,不过只加一个参数即OK,不过上面这个参数加上也不会报错。
(ADO.NET小知识点汇总)看到什么记什么的更多相关文章
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...
- python小知识点汇总
一 写mysql 场景:自动化用例中需要构造数据,写入redis 表中已有该primary_key的记录,在现有基础上更新字段 表中无该记录,需要插入 # 请求传入table字段,db.table,c ...
- 【nodejs笔记——小知识点汇总】
1. ejs标签: <% %> , <%- %> , <%= %>的区别 ejs的标签分为三种: (1)<% code %> javasc ...
- html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)
1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...
- Android开发之实用小知识点汇总-2
1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...
- Android开发之实用小知识点汇总-1
1.去掉android屏幕中的actionbar: this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 //这个是全屏幕显示的代码 ...
- Linux小知识点汇总
1.crontab (1)crontab每10秒执行一次 * * * * * /bin/date >>/tmp/date.txt * * * * * sleep 10; ...
- Kendo UI 使用小知识点汇总
本攻略适用于了解的kendo UI 的基本语法的人使用.如果还不了解Kendo UI的基本语法,请大力观摹Demo ,并自己动用写几个控件. 1.获取Kendo UI的控件实体,不必存成全局变量. ...
- java小知识点汇总
1.ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安 ...
随机推荐
- C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法
C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法 Bitmap类:此类封装了GDI+中的一个位图,次位图有图形图像及其属性的像素数据组成.因此此类是用于处理像素数据定义的图形的对象.该类的 ...
- Crash日志分析
从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...
- [备忘]java 静态块、非静态块、静态函数、构造函数 执行顺序
原文链接:http://liqita.iteye.com/blog/1472717 java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始 ...
- jquery进阶(1)
今天我们接着来学习jQuery中的内容,包括css的操作.尺寸的操作.文档的操作.动画(有待补充),事件处理操作. 一.CSS 在css中可以设置css的基本属性 - .css("color ...
- MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析
MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...
- #include< >和#include“ ”的区别
< >引用的是编译器的类库路径里面的头文件 " "引用的是你程序目录的相对路径中的头文件 假如你编译器定义的自带头文件引用在C:\Keil\c51\INC\下面 则#i ...
- MyBatis源码探索
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获 ...
- selenium跳过https的问题
背景: 周六产品给我反馈:支付成功页面后会提示这个,问自动化为什么没有发现这样的问题 第一反应:这个地址肯定被举报了,我也肯定没有设置过安全链接,因为都没有见过这样的网址,如果有问题,应该会直接出错, ...
- Object.prototype.toString的应用
使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下: Object.prototype.toString.call(value)1.判断基本类型: Obje ...
- Java设计模式学习——设计原则
第一章 设计原则 1.开闭原则 一个软件实体,像类,模块,函数应该对扩展开放,对修改关闭 在设计的时候,要时刻考虑,让这个类尽量的好,写好了就不要去修改.如果有新的需求来,在增加一个类就完事了,原来的 ...