当前位置:嗨网首页>书籍在线阅读

18-高手点拨

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

18.6 高手点拨

**本节视频教学录像:3分钟**

1.在C#中使用using语句释放资源

using语句允许程序员指定使用资源的对象应当何时释放资源。通常,C#通过.NET Framework公共语言运行库(CLR)来自动释放用来存储不再需要的对象的内存。CLR内存的释放具有不确定性,只有在CLR决定执行垃圾回收时才会释放内存。然而,诸如文件句柄和网络连接这样的有限资源需要尽快释放。可以在 using 语句中声明对象,并定义一个该对象的使用范围,实现在此范围之外尽快释放一个或多个对象。例如,【范例18-2】中的语句:

using (SqlConnection connection = new SqlConnection(connectionString))

在 using 语句中声明了connection对象,并在using语句范围内的代码执行完毕时自动释放connection对象所占的资源。因此,使用using语句是安全的,因为它能正确地释放对象。同时,因为在using语句里定义的对象是只读的,因此能有效地防止那些重要的对象被修改或重定义。

2.在C#中使用SqlCommandBuilder更新数据源

将SqlCommandBuilder与SqlDataAdapter结合使用,可以方便地实现数据库更新。【范例18-4】中,如果把语句:

SqlCommandBuilder scb = new SqlCommandBuilder(myDataAdapter);

删除,程序编译时会发生错误。原因在于SqlDataAdapter不会自动生成通过DataSet更新数据源所需的update语句。这时需要创建一个SqlCommandBuilder对象,该对象将根据SqlDataAdapter的SelectCommand属性来自动生成相应的Insert、update、delete更新语句。在调用SqlDataAdapter对象的update方法时,SqlCommandBuilder对象生成的这些更新语句将帮助SqlDataAdapter实现对数据源的单表更新。需要注意的是,SqlDataAdapter的Select语句中返回的列要包括主键列,否则SqlCommandBuilder对象将无法产生Update和Delete语句。

3.使用参数CommandBehavior.CloseConnection关闭数据连接

由于DataReader对象使用流模式读取数据,数据读取的动作是连续进行的,在具体应用时很难确定数据库连接何时才能被关闭。上例中,如果Slipway类的getAllSlipway方法直接返回DataReader对象sqlread或者sqlread是类成员,意味着将在方法以外处理sqlread,此时若直接关闭其所属的连接对象,sqlread将不能再被访问。【范例18-7】中的下面这条语句:

sqlread = cmd.ExecuteReader(CommandBehavior.CloseConnection);

能保证在方法以外处理sqlread对象后,sqlread被关闭时,其依赖的连接也会被自动关闭。

4.DBNull与null的区别

null关键字是表示不引用任何对象的空引用的文字值,它是引用类型变量的默认值。也就是说,只有引用型的变量可以为null,语句“int i=null”是错误的,因为int是值类型的。C#允许使用“==”或“!=”来判断是否为null。

DBNull在.Net中是单独的一个类型,用于指示不存在某个已知值(通常在数据库应用程序中)。其实例只有一个,即DBNull.Value。默认情况下,数据表中的未初始化字段具有DBNull值。也就是说,对于数据库中任意一条数据记录,row[column] 返回的值或者是column类型的值,或者是DBNull,而不可能是null。

【范例18-8】中的下面这条语句:

dt.Rows[i]["slipwayNo"]= DBNull.Value;

实现把某条记录的“slipwayNo”字段值清空。

5.Binding对象的隐式调用。

在数据绑定技术的实际应用中,也可以不显示声明Binding对象实现数据到控件的绑定。如【范例18-11】中的代码:

Binding bind_name = new Binding("Text", splist, "name", true);
textBox1.DataBindings.Add(bind_name);
Binding bind_volume = new Binding("Text", splist, "volume", true);
textBox2.DataBindings.Add(bind_volume);

修改为下面的语句:

textBox1.DataBindings.Add("Text", splist, "name");
textBox2.DataBindings.Add("Text", splist, "volume");

其实现的功能是一样的。