ADO.Net知识总结
- ADO.NET: .NET中用来向数据库提交执行SQL语句的一堆类
- 本机访问直接"Windows验证",但是一般项目中都是单独的数据库服务器,程序在另外一台电脑上连接SQLServer在项目中,一般不会启用sa账户,这个是最高权限账户,应该设置一个受限制的账户
- SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于一个指针(游标), 只能读取当前游标指向的行,一旦连接断开再不能读取.这样做的好处是无论查询结果有多少条,对程序占用的内存几乎没有影响.
- SqlDataReader对于小数据量的数据来说带来的只有麻烦. ADO.NET中提供了数据集的机制,将数据结果填充到本地内存中,这样连接断开,服务器断开都不影响数据的读取.数据集的好处是降低数据库服务器压力,编程也简单(其实原理大致还是用reader读取所有数据,储存在list中)
- SqlHelper的作用,主要作用: 读取配置文件的连接数据库字符串,实现一些和数据库的参数查询函数,传入参数一般是sql命令和parameter[]参数数组
- SqlHelper的一些问题,对于0参数 DataTable datatable = SqlHelper .ExecuteDataTable(sql, new SqlParameter[0]);
- 注意NULL和DBNULL的区别
一、连接字符串的写法
l Data Source=; 指定服务器IP(计算机名) 服务器\实例名
l Initial Catalog=;初始化分类,要连哪个数据库名
l UserId=sa;Password=sa;用户名密码
l Integrated Security=true; 使用Windows验证方法
l 另外一种写法(旧):"server=.;database=”数据库名字“;uid=sa;pwd=sa"
二、Ado.Net连接池
l 当第一次创建一个连接对象并调用Open()操作的时候,该连接对象会向数据库发出一个连接请求,并且进行连接。
l 当调用该对象的Close()方法时,并没有直下关闭连接对象,而是放入了“连接池”中,
l 当下次再创建一个连接对象的时候,如果该对象所使用的连接字符串与池中现有的连接对象使用的字符串一模一样(大小写空格等都必须一样),这时,并不会直下的再创建一个连接,而是使用池中现有的对象。
l 如果再次创建的连接对象所使用的连接字符串不一样,此时,则会创建一个新的连接。
l 只有当调用了连接对象的Close()方法后,当前连接才会放入到池中。
l 如果创建时和上一个连接对象一模一样,但上一个连接并没有Close()即:并没有放入池中,这时,也会创建一个连接。
三、ADO.Net中常用的几个对象
l SqlConnection:数据库连接对象
l Command:执行SQL语句命令
l DataReader:只读、只进结果集
l DataAdapter:适配器
l DataSet:相当于内存中的临时数据库
l SqlDataReader对象:
n reader.HasRow=true表明有数据
n reader.Read() 指向下一条 //读取前要先Read()
n reader[0] 获取列的数据
n reader[]有重载,有列索引也有列名,费钱要求使用列索引
n reader.GetValue(索引);
n reader.GetOrdinal(列名);根据列名获取列的索引
n reader.GetInt32(索引); 直接获取强类型 (有一个Null的问题)
n int? age =reader.IsDBNull(2)?null : (int?) reader.GetInt32(2);
n 使用时必需保证SqlConnection是打开的,不能中途关闭!
n reader.GetInt32(索引) 索引和查询的顺序有关!
n 不要忘记使用using()释放,DataReader独享一个Connection
四、使用存储过程
- cmd.CommandType=CommandType.Procedure //指定为存储过程
- pms[2].Direction = ParameterDirection.Output; //参数的输出方向:输入参数、输出参数
(*)封装SqlHelper类
SqlHelper.cs是多年前微软出品的一个使用ADO.Net方法对SQL Server数据库进行操作的封装类。而我们自己手写的SqlHelper类同样是对数据库访问方法的一个封装类库,让我们在访问数据库的时候可以很方便地调用其中封装的方法,省略了很多重复劳动。在声明SqlHelper的时候,我们一般会声明为一个静态类,不使用静态类的话有可能产生一些未知的错误(苏老师说微软说的)。
这个类中我们常用的方法如下:
- ExecuteNonQuery(): 执行简单的无返回值的查询。
- ExecuteReader(): 使用DataReader读取数据。(注:少量数据的情况下使用 SqlDataReader的效率高于使用Dataset)
- ExecuteScalar(): 返回结果集中的第一行第一列,相当于返回单个值。
- ExcuteDataSet (): 返回Dataset的查询,相当于返回一个数组。
除此之外,我们根据需要以及兴趣也可以再增加一些其他的方法,对其进行修改以及扩展。
第一步、连接字符串
首先需要定义一个只读的连接字符串,连接字符串可以直接写死为一个固定的字符串,也可以从项目的配置文件中取得,一般使用后者:
private static readonly string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
这样的话windows应用程序的配置文件Web.config中可以配置连接字符串如下:
<configuration>
<connectionStrings>
<add name="connStr" connectionString="server=.;database=Exam;integrated security=true;"/>
</connectionStrings>
</configuration>
第二步、封装ExcuteNonQuery
首先先写一个完整的带CommandType参数的方法:
public static int ExcuteNonQuery(string sql, CommandType cmdType, params SqlParameter[] sps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
cmd.CommandText = sql;
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
}
在这里,SqlConnection表示Sql Server数据库的一个打开的连接,SqlCommand表示Sql Server数据库执行的一个sql语句或者存储过程。然后再判断参数数组是否为空,不为空时,将参数数组加入到数据库执行命令中。最后打开连接,运行ExecuteNonQuery方法。当然,最好把最后2步try起来,捕获异常并抛出。
有了完整的ExecuteNonQuery方法,我们就可以调用它,通过指定CommandType为CommandType.Text,再封装一个执行Sql语句的重载:
public static int ExcuteNonQuery(string sql, params SqlParameter[] sps)
{
return ExcuteNonQuery(sql, CommandType.Text, sps);
}
第三步、封装ExecuteScalar
ExecuteScalar与ExcuteNonQuery的使用一模一样,只是返回值得类型为object而已,这里就不赘述了。
public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)
{
SqlConnection conn = new SqlConnection(connStr);
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
重载方法:
public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)
{
return ExceuteReader(sql, CommandType.Text, sps);
}
第四步、ExceuteReader
ExceuteReader方法中返回的是一个SqlDataReader类型的对象reader,使用者拿到这个reader,再通过
while(reader.read())
{
……
}
reader.close();
的方式从数据库中一条一条地读取数据,读完之后调用reader的close方法,在这之前,ExceuteReader中的数据库连接不能中断,否则数据库连接中断,用户就无法从数据库中拿到数据了,所以ExceuteReader方法中,数据库连接的创建不能用using包起来,并且执行命令的方法该这样写cmd.ExecuteReader(CommandBehavior.CloseConnection),CommandBehavior.CloseConnection表示在执行该命令时,如果关联的DataReader对象被关闭,那么关联的Connection对象也会被关闭,这样,当调用端调用reader.close()时,数据库连接将被关闭。
public static SqlDataReader ExceuteReader(string sql, CommandType cmdType, params SqlParameter[] sps)
{
SqlConnection conn = new SqlConnection(connStr);
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
try
{
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
重载方法:
public static SqlDataReader ExcuteReader(string sql, params SqlParameter[] sps)
{
return ExceuteReader(sql, CommandType.Text, sps);
}
第五步、ExcuteDataSet
ExcuteDataSet用于返回一个DataSet(也可以返回DataTable, 两者区别不大)。先通过SqlDataAdapter的构造函数声明一个SqlDataAdapter对象da,再调用da的Fill方法,把查询到的表放到DataSet中,最后返回这个DataSet。
public static DataSet ExcuteDataSet(string sql, CommandType cmdType, params SqlParameter[] sps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataSet ds = new DataSet();
try
{
conn.Open();
da.Fill(ds);
return ds;
}
catch (Exception ex)
{
conn.Close();
throw new Exception(ex.Message);
}
}
}
}
}
上面定义da的这一大串
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
if (sps != null)
{
cmd.Parameters.AddRange(sps);
}
cmd.CommandType = cmdType;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
也可以通过SqlDataAdapter的构造方法
public SqlDataAdapter(string selectCommandText, string selectConnectionString) : this()来实现:
SqlDataAdapter da = new SqlDataAdapter(sql, connStr);
da.SelectCommand.CommandType = cmdType;
重载方法:
public static DataSet ExcuteDataSet(string sql, params SqlParameter[] sps)
{
return ExcuteDataSet(sql, CommandType.Text, sps);
}
- 定义类,定义属性
- new一个实例, 给要绑定的控件设定DataContext, txtName.Context = p1;txtAge.Context = p1;
- Xaml中要进行数据绑定的属性Text="{Binding Name}" , 几乎所有的控件属性都这样数据绑定的
- Text="{Binding Name}" ,把控件的Text属性当顶到DataContext指向的p1对象的Name属性上来
- 由于普通对象没有"通知我的属性变了"这么一种机制,所以改变对象的属性界面不会变. 但是界面改变是有TextChanged之类的事件的,所以界面可以同步到修改对象.
- 如果要求后台对象的值发生改变界面跟着变,则需要类实现INotifyPropertyChanged接口,并且在属性值变化后触发事件;(一般不需要)
- 父类控件的数据绑定后,子类控件数据绑定都绑定响应的数据对象
- class Person : INotifyPropertyChanged{private int age;public int Age{get{return age;}set{this.age = value ;if (PropertyChanged != null ){PropertyChanged( this, new PropertyChangedEventArgs( "Age"));}}}public event PropertyChangedEventHandler PropertyChanged;}
- *like一定要慎用,会导致全部检索,效率太低,如果需要,可以借鉴'全文检索'技术
- 有空可以去看看Lucene.Net
- 数据库中的NULL表示不知道 唯一比较 select * from T_Table where name is NULL (name=NULL是不可以的)
- 数据库连接池: ado.net会尽可能地服用连接池中的链接, 不断关闭和打开不太会影响时间
转载于:https://www.cnblogs.com/reganLi/p/3403702.html
ADO.Net知识总结相关推荐
- ASP分页要用到的属性ADO CursorLocation知识补充:
ASP分页要用到的属性ADO CursorLocation知识补充: 定义和用法 CursorLocation 属性可设置或返回一个 long 值,该值指示游标服务的位置.可被设置为 CursorLo ...
- ADO.NET知识学习总结
1. 概述 使用的命名空间: System.Data.SqlClient 连接字符串 服务器/数据库实例+数据库名称+安全信息+用户名+密码 可参考http://www.connections ...
- ADO.NET知识要点
1. ADO.NET的5个对象可以形象的记为:连接"Connection",执行"Command",读取"DataReader",分配&qu ...
- ADO.NET知识汇总
这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...
- 北大青鳥S1-关于c#-ADO基础知识整理
String str = "Date source=服务器名字/如果是本地机的话我们可以用.来代替 initial catalog=数据库名字: user id=数据库登陆名字 ...
- ADO.Net的小知识(连接数据库)二
上次提到数据库连接有两种形式断开式连接和打开式连接,断开式连接我已经讲解了,下面我来给大家讲解一下打开式连接 (1)引入命名空间:using System.Data.SqlClient; 该语句用于导 ...
- ADO学习(七)ADOX相关知识
一.ADOX 概述 Microsoft? ActiveX? Data Objects Extensions for Data Definition Language and Security (ADO ...
- 【ADO.NET基础知识】SqlConnection、command、DataSet 、DataTable、dataAdapter
1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: ...
- 【转】ADO.Net之SqlConnection、 Sqlcommand的应用学习心得(思维导图,知识解析,案例分析)
ADO.Net之SqlConnection. Sqlcommand的应用 一.思维导图: ADO.NET与SQL连接: 二.知识点介绍: SqlConnection和Sqlcommand都是组成数据提 ...
最新文章
- 有关C语言指针学习思想的随笔常用形式的总结(原创)
- 优化SQl语句的十个重要步骤
- 阿里云linux下修改mysql默认密码(xampp环境)- 原创
- system volume information怎么删除_文件系统怎么让Linux内核认识自己
- 北漂周记--第2记--培训开始
- js(javascript)之浏览器控制台使用
- 2021年南阳市五中高考成绩查询,南阳市“赫赫有名”的五大高中,2020年高考成绩一目了然!...
- 谭浩强C语言(第三版)习题5.7
- 2012 年上半年系统分析师 案例分析真题
- CVPR 2020评审结果放出,魏秀参博士教你如何rebuttal!!!
- 为资产分类定义折旧范围_SAP折旧范围
- 国内外自媒体短视频平台有哪些?又有哪些适合个人赚钱的呢?
- g++ warn_unused_result
- Camera 图像处理原理分析- 色彩篇 一
- SSD-caffe踩keng
- 有意思的hand-crafted features based IQA的论文吧(图像质量评价)
- 计算机无法完成更新如何处理,Win10更新过程中碰到“无法完成更新”怎么办
- 组件服务 我的电脑 不可用解决办法
- 【深度森林算法实践】分类与回归
- usb和串口传输速度,串口、PS\2和USB接口的传输速率