1、对于连接对象,如果写在了using里面,即便发生了异常,当using语句退出时候也会调用Dispose()方法,也会释放资源,所以可以在using中使用连接对象,而不用try-catch。
2、ExecuteScalar(),内部就是对ExecuteReader()的一个封装;返回值是单行单列。
3、insert into TblClass output inserted.tclassId values('黑马4期','热招中'),执行插入语句返回生成的自动编号。
4、执行任何sql语句其实调用Command对象的ExecuteScalar()、ExecuteReader()、ExecuteNonQuery()都可以,只不过是执行对应的语句如果选对了方法,用起来更合适。
5、SqldataReader
特性1:由于每次向前走一步,都会将上一条记录销毁,所以DataReader是只进的;特性2:只能读取数据,不能修改数据,因为查询出的数据集是一个独立的服务器内存中的数据,已经与原表没有关系了。特性3:使用时必须保证Sqlconnection的Open状态。
6、reader["ClassName"],经反编译索引器里面调的就是GetValue()方法。
reader[0],一般没有特殊情况,建议使用索引来获取信息,不要使用列名(效率低下)。在循环外面根据列名先计算出来索引,然后在循环里面还是使用索引。
7、数据库中的float,这里得用getDouble()来获取。
8、当多个结果集的时候可以调用nextResult();9、一般情况datareader独享一个Connection。
10、当当前列如果为null的话,调用强类型的获取数据的方法就报错了,此时就需要获取数据之前做一个判断,通过reader.ISDBNull(index)来验证。
11、ado.net的连接池:1-企业连接池与禁用连接池为什么性能差距这么大?当启用连接池后,看似是2000次的登录与注销(连接的打开和关闭),其实只有一次打开,当程序关闭后,才会关闭。所以高性能。2-而禁用连接池后,才是真正的打开关闭2000次。
12、连接池使用总结:1-第一次打开连接会创建一个连接对象。2-当这个连接关闭时(调用Close()方法时),会将当前连接对象放入池中。3-下一个连接对象,如果连接字符串与池中现有的连接字符串一致,则会使用池中现有连接,而不会重新创建一个。4-只有调用Close()的时候此时放入池中,如果一个连接对象一直在使用,则下次再创建一个连接对象发现池中没有,也会在创建一个新连接对象。在池中的连接对象,如果过一段时间没有访问,则会自动销毁。
2、ExecuteScalar(),内部就是对ExecuteReader()的一个封装;返回值是单行单列。
3、insert into TblClass output inserted.tclassId values('黑马4期','热招中'),执行插入语句返回生成的自动编号。
4、执行任何sql语句其实调用Command对象的ExecuteScalar()、ExecuteReader()、ExecuteNonQuery()都可以,只不过是执行对应的语句如果选对了方法,用起来更合适。
5、SqldataReader
特性1:由于每次向前走一步,都会将上一条记录销毁,所以DataReader是只进的;特性2:只能读取数据,不能修改数据,因为查询出的数据集是一个独立的服务器内存中的数据,已经与原表没有关系了。特性3:使用时必须保证Sqlconnection的Open状态。
6、reader["ClassName"],经反编译索引器里面调的就是GetValue()方法。
reader[0],一般没有特殊情况,建议使用索引来获取信息,不要使用列名(效率低下)。在循环外面根据列名先计算出来索引,然后在循环里面还是使用索引。
7、数据库中的float,这里得用getDouble()来获取。
8、当多个结果集的时候可以调用nextResult();9、一般情况datareader独享一个Connection。
10、当当前列如果为null的话,调用强类型的获取数据的方法就报错了,此时就需要获取数据之前做一个判断,通过reader.ISDBNull(index)来验证。
11、ado.net的连接池:1-企业连接池与禁用连接池为什么性能差距这么大?当启用连接池后,看似是2000次的登录与注销(连接的打开和关闭),其实只有一次打开,当程序关闭后,才会关闭。所以高性能。2-而禁用连接池后,才是真正的打开关闭2000次。
12、连接池使用总结:1-第一次打开连接会创建一个连接对象。2-当这个连接关闭时(调用Close()方法时),会将当前连接对象放入池中。3-下一个连接对象,如果连接字符串与池中现有的连接字符串一致,则会使用池中现有连接,而不会重新创建一个。4-只有调用Close()的时候此时放入池中,如果一个连接对象一直在使用,则下次再创建一个连接对象发现池中没有,也会在创建一个新连接对象。在池中的连接对象,如果过一段时间没有访问,则会自动销毁。
13、year(1986-11-20),得到的就是年的部分,1986。只要不要分组就可以在select后加*,
14、datediff(month,'2012-7-4','2012-7-19')可以验证是否为同一月份。
15、连接对象不可以重复打开,可以重复关闭。
16、ExecuteNonQuery方法用来执行insert、delete、update语句。
17、数据库尽量保证最晚时间打开,
最早时间关闭。用之前在打开,用完后就关闭。
18、HasRows属性,用来判断这次查询是否查询除了数据,如果查询除了数据则开始循环获取每一条数据。
19、在reader使用过程当中,必须保证connection是打开状态。
6-16笔记
1、ExecuteNonQuery()执行insert,delete,update,返回的是所影响的行数,执行其他语句返回的都是-1。
2、带参数的SQL语句和存储过程都能防止注入漏洞攻击,但SQL语句其实也是调用了一个executesql存储过程来避免注入漏洞攻击。
3、在数据库中两个'表示一个';'',转义一个'。
4、addwithvalue就是为了方便,内部就是调了一个add。
5、编写实体类的时候一定要有属性,不要用字段。
6、创建行不能new,是通过系统给我们new的,把创建好的行加到集合中去,多创建几行,先运行一下循环输出数据,
7、强类型转换的时候要用IsDBNull来判断一下,不然会报错。
string objClaDesc =reader.IsDBNull(2)?"NULL":reader.GetString(2);
8、执行SQL语句返回一个DataReader,当返回Datereader的时候,注意:1-connection不能关闭;2-DataReader不能关闭;3-command对象执行ExecuteReader()的时候需要传递一个CommangBehavior.CloseConnection。
9、SqlDataAdapter内部封装了SqlConnection、Sqlcommand、SqlDataReader。