使用using 语句
SqlConnection conn = new SqlConnection (connString); try { conn.Open(); //省略访问数据库代码....... } catch(Exception ex) { throw ex; } finally { conn.Close(); }
数据库连接通常属于有限的服务器资源,因此要在使用完之后马上关闭。这是提高数据库访问性能的基本方法。在代码中,finally快中调用Close方法释放连接,确保即使有异常发生
连接也能被释放。除了使用try-catch-finally 语句外,也可以通过使用using 语句来尽快释放资源。
using 语句两个作用。
1.作为关键字,using可以导入命名空间。
2.作为C#语句,using 可以释放对象占用的内存资源,基本语法如下:
using (SqlConnection conn = new SqlConnection (connString)) { //数据库操作代码 }
using 语句允许用户定义一个范围,并在范围末尾处释放对象,实例中在using语句中定义了一个数据连接对象conn,当程序执行到using 语句末尾时,CLR立即通过调用对象的
Dispose()方法释放相应的对象。再如:
using (SqlDataReaderreader= com.ExecuteReader(CommandBehavior.CloseConnection) ) { while(reader.Read()) { //遍历获得查询结果 } }
在利用执行命令对象的ExexuteReader ()方法来获得数据读取器对象时,有一个可选参数,那就是通过指定CommandBehavior.CloseConnection 让数据读取器自动关闭关联
的连接对象。
在using 语句内实例化对象,并将对象作用范围限制在using 块中,这是推荐使用的方式。通过它简化了代码,并在一定的程度上提高了资源的使用效率
using 语句的本质:
既然using可以释放对象,是不是在所有对象前都可以使用using来限制呢?当然不是!!!
1.using可以主动释放的对象都需要实现IDisable接口
2.即使都实现了IDisable接口,也没有必要全部使用using,我们只对那些对系统性能有重要影响的对象进行using限定,而其他的对象可以交给垃圾回收器处理
参数化命令
SQL语句 string sql = "insert student values("+student.stuNo+.......")";
观察上句发现Sq语句具有很多的参数,构建的字符串很复杂。很明显,这种写法至少有以下缺点。
1.SQL语句不美观,而且容易出现错误。如果在拼接字符串是忘记单引号,小括号,排错是很麻烦的。
2.安全性差。拼接字符串行成的SQL语句为SQL注入SQL注入攻击提供了温床。
使用参数化命令
1.SqlCommand 的 Parameters的集合
参数化命令是在SQL文本中使用占位符的命令,修改传统的SQL硬编码方式,可以这样写:
StringBuilder sb = new StringBuilder(); sb.APPendLine("Insert [Student]"); sb.APPendLine(" [VALUES]"); sb.APPendLine("(@StudentNO,@LoginPwd,@StudentName)");
ADO.NET 命令对象使用一个集合保存离散的参数类型,即SqlCommand对象的Parameters集合。
用户可以添加任意多的参数对象并映射到SQL语句中的占位符。SqlCommand 类的Parameters集合提供了多种方式传送参数,下面列出常用的几种。
使用参数名和参数类型进行设置,方法定义如下:
public Sqlparameter Add (string parameterName, SqlDbtype sqlDbType); public Sqlparameter Add (string parameterName,SqlDbType paraValue,int size);
使用SqlParameter 对象进行填充,方法定义如下:
public SqlParameter Add(SqlParameter value);//添加单个参数 public void AddRange(SqlParameter [] values);//添加多个参数
通过Parameters集合的Add方法填充参数集合。例如添加参数“@StudentName”并设置对应的值代码如下:
com.Parameters.Add("@StudentName",SqlDbType.NVarChar); com.Parameters["@StudentName"].Value = studen.studentName;
调用Add()方法,传入需要填充的参数名称和对应的数据库中该字段的类型,即可设置该参数,调用返回的结果是Sqlparameter对象,通过参数名称找到该对象并设置
参数值。注意:集合中参数要匹配执行查询的要求,否则可能会导致错误。
2.使用SqlParameter对象进行填充
SqlParameter 类提供了许多属性来配置参数,如名字,大小,类型和其他一些如参数传递方向等特性
属性 | 说明 |
DbType | 获取或设置参数的DbType |
Direction | 获取或设置一个值,该值指示参数是只可输入,只可输出,还是双向存储过程返回值参数 |
IsNullable |
获取或设置一个值,该值指示参数是否接受空值 |
ParameterName | 获取或设置 SqlParameter的名称 |
Siza | 获取或设置列中数据的最大值(以字节为单位) |
SqlDbType | 获取或设置参数的SqlDbType |
Value | 获取或设置该参数的值 |