3
、注意打开和关闭连接的处理
在调用
SqlCommand
对象执行
sql
命令之前,需要保证与该对象关联的
SqlConnection
对象时打开的,否则
SqlCommand
的方法执行时将引发一个异常,但是我们在上面的代码中看到,
SqlDataAdapter
没有这样的要求。
如果调用
SqlDataAdapter
的
Fill
方法,并且其
SelectCommand
属性的
SqlConnection
是关闭状态,则
SqlDataAdapter
会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用
Fill
方法前,
SqlConnection
是打开的,则查询执行完毕后,
SqlConnection
还将是打开的,也就是说
SqlDataAdapter
会保证
SqlConnection
的状态恢复到原来的情形。
这有时会导致性能问题,需要注意,例如下面的代码:
string
strConn=
"uid=账号;pwd=密码;database=数据库;server=服务器"
;
SqlConnection conn=
new
SqlConnection(strConn);
SqlDataAdapter daCustomers,daOrders;
strSql=
"SELECT * FROM Customers"
;
daCustomers =
new
SqlDataAdapter(strSql, conn);
strSql=
"SELECT * FROM Orders"
;
daOrders=
new
SqlDataAdapter(strSql, conn);
DataSet ds=
new
DataSet();
daCustomers.Fill(ds,
"Customers"
);
daOrders.Fill(ds,
"Orders"
);
string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串
SqlConnection conn=new SqlConnection(strConn);
SqlDataAdapter daCustomers,daOrders;
strSql="SELECT * FROM Customers";
daCustomers = new SqlDataAdapter(strSql, conn);
strSql="SELECT * FROM Orders";
daOrders=new SqlDataAdapter(strSql, conn);
DataSet ds=new DataSet();
daCustomers.Fill(ds,"Customers");
daOrders.Fill(ds,"Orders");
以上代码会导致连接被打开和关闭两次,在调用
Fill
方法时各一次。为了避免打开和关闭
SqlConnection
对象,在调用
SqlDataAdapter
对象的
Fill
方法之前,我们可以先打开
SqlConnection
对象,如果希望之后关闭连接,我们可以再调用
Close
方法,就像这样:
string
strConn=
"uid=账号;pwd=密码;database=数据库;server=服务器"
;
strSql=
"SELECT * FROM Customers"
;
SqlDataAdapter da=
new
SqlDataAdapter(strSql, strConn);
DataSet ds=
new
DataSet();
da.Fill(ds,
"Customers"
);
da.Fill(ds,
"Customers"
);
string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串
strSql="SELECT * FROM Customers";
SqlDataAdapter da=new SqlDataAdapter(strSql, strConn);
DataSet ds=new DataSet();
da.Fill(ds,"Customers");
//…….
da.Fill(ds,"Customers");
我们分析上面的代码,通过两次调用
Fill
方法,
SqlDataAdapter
执行两次查询,并两次将查询结果保存到
DataSet
中,第一次调用在
DataSet
中创建了一个名为
Customers
的新表。第二次调用
Fill
方法将查询的结果追加到
DataSet
中的同一个表中,因此,每个客户的信息将在
DataSet
中出现两次!当然,如果数据库管理员对
Customers
表定义了主键,则
SqlDataAdapter
在天成
DataTable
时,会判断重复行,并自动丢弃掉旧的值。
考虑一下,假定一个特定客户在第一次调用
Fill
方法时,存储于数据库中,那么
SqlDataAdapter
会将其添加到新建的
DataTable
中。如果后来这个客户被删除了,那么第二次调用
Fill
方法时,
SqlDataAdapter
将不会在查询结果中找到该客户信息,但是它也不会将客户信息从
DataSet
中删除。这就导致了数据更新的问题。
所以推荐的做法是,在调用
Fill
方法前,先删除本地
DataSet
中缓存的数据
!
转载:
http://blog.csdn.net/gatieme/article/details/20695853
Winform控件优化之圆角Panel【绘制时需要注意的几点和扩展】
圆角的实现(原理和绘制方法)之前基本都已经介绍,本篇主要是实现圆角Panel时介绍几点注意点和一些扩展。一是BackColor应始终为Transparent;二是Draw完全显示绘制出的线条...
Windows Server IIS配置 怎么禁用不安全的SSL2.0和SSL3.0协议?
Windows Server IIS配置 怎么禁用不安全的SSL2.0和SSL3.0协议?
【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
原文:错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
转载于(https://social.
Vue-router(二) 子路由(嵌套路由)
实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件。借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。
12075