成都网站建设设计

将想法与焦点和您一起共享

vb.net把对象关闭 vb不能关闭的窗口

如何用VB实现关闭所有数据库对象

如果你在程序中使用了任何数据库对象(DAO,

创新互联专注于黄岩企业网站建设,响应式网站设计,电子商务商城网站建设。黄岩网站建设公司,为黄岩等地区提供建站服务。全流程按需制作,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

RDO,

或者

ADO),

在退出程序之前,你必须确认已经关闭掉了所有已经打开的记录、数据库和数据工作台(recordsets,

databases,

and

workspaces)。虽然退出程序时这些对象的指针都被自动施放了,但是如果你自己又不能确认是否真正地释放了打开的数据库对象,那么就有可能数据库连接没有马上被释放掉,从而被这些对象所占用的内存就再也不能被操作系统再次分配。

----

下面有一段放在Form_Unload

事件(或者其他退出模块中)中的一小段代码例子,它演示了关闭所有打开的DAO

工作台、数据库和记录并释放了被这些对象占用的内存。当你退出FORM时,不论在有一个、100个甚至没有数据库连接时都可以使用下面代码。

Private

Sub

Form_Unload(Cancel

As

Integer)

'

关闭数据库对象并且释放内存

VB连接数据库出现“对象关闭时,不允许操作”的错误,急!

VB中“对象关闭时,不允许操作”解决方案

最近两天在VB里弄一些小程序,好久没接触了,感觉有些陌生了,还算有点基础吧,遇到一些小的难题基本上都能解决。不过,这下真的遇到难题了,琢磨半天硬是没弄出结果来,在网上查资料也没个底,如同大海捞针呀,关键是没一点正经的答案和可行的方案。

问题是这样的,在VB中执行存储过程,想输出返回值并将数据绑定到DataGrid控件中,本来是件小菜的问题,在.NET、ASP里都做通过,但在VB里却是折磨了半天也没弄出来。还是自己动手吧,有问题就得想办法,一步步来吧。

先在SQL 2000中写好存储过程了,(这里不再写出存储过程的具体代码了,也就是一个返回值,一个记录集)然后在VB中引用ADO对象,输入如下代码,以调用存储过程:

Dim lackconn As New ADODB.Connection

lackconn.ConnectionString=Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=boyd;Initial Catalog=mydb;Data Source=(local)

lackconn.CursorLocation = adUseClient '设置为客户端

lackconn.Open

Set lackcmd = New ADODB.Command

lackcmd.ActiveConnection = lackconn

lackcmd.CommandText = myproc '这里为存储过程名称

lackcmd.CommandType = adCmdStoredProc '指定为存储过程

Set param = lackcmd.CreateParameter(@num, adInteger, adParamReturnValue, 4) '@num为返回值

lackcmd.Parameters.Append param

Set lackrs = New ADODB.Recordset

Set lackrs = lackcmd.Execute()

msgbox 站点总数: lackcmd.Parameters(@num).Value 个

Set mydatagrid.DataSource = lackrs 'mydatagrid为对象名称

mydatagrid.Refresh '刷新DataGrid

'下面关闭数据库对象等略去

就这样的一个简单的代码,一运行就出错,提示错误在“Set mydatagrid.DataSource = lackrs”,错误就是“对象关闭时,不允许操作”。郁闷ing...,这哪来的错误呢?我根本没关闭数据库连接,其他内容也是没有问题的呀。花了很长时间没能解决,大清早再打开电脑时,灵机一动,搞定了。这里将这种现象作下总结,顺便记录一下本次解决过程。

产生这种现象有几种原因:

1、数据库对象连接被关闭了,这肯定会报错的,当然也不能输出任何结果的,这时只需注意“先使用、后关闭”就行了,解决这样的问题就是暂时先不要关闭数据库连接就行了。

2、返回记录为空时,也会报错。如下面的代码

sql = select * from dbcn where 状态='0'

Set rs = conn.Execute(sql)

If Not rs.EOF Then

For m = 1 To rs.RecordCount

List_status.AddItem rs(1) ( rs(2) ): rs(4)

rs.MoveNext

Next m

End If

如果没有数据的话,这里也会提示这样的错误,将查询代码放到SQL查询分析器里运行一下,果然没有数据,呵呵。当然这样的错误可以采用一些方法排除或过滤的。

3、这就是我这次所遇到的问题的中心了,我们将目光转向存储过程。的确,在SQL查询分析器里,存储过程是正常运行,而且不会报错,也有数据。但仔细想想,因为在存储过程可能包含了有关SQL语句影响行数的信息,这样一来也就可能会导致这样的情况。

打开存储过程,在begin后面加上一句代码:set nocount on,屏蔽掉这些信息。OK,VB中的程序巳经能够正常运行了,而且数据也是正常的。

顺便解释一下吧,打开查询分析器中的帮助,查找一下有关set nocount on的信息,我们会找到这些东西:

====================================

SET NOCOUNT

使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。

语法

SET NOCOUNT { ON | OFF }

注释

当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示nn rows affected。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

权限

SET NOCOUNT 权限默认授予所有用户。

示例

下例在 osql 实用工具或 SQL Server 查询分析器中执行时,可防止显示有关受影响的行数的信息。

USE pubs

GO

-- Display the count message.

SELECT au_lname

FROM authors

GO

USE pubs

GO

-- SET NOCOUNT to ON and no longer display the count message.

SET NOCOUNT ON

GO

SELECT au_lname

FROM authors

GO

-- Reset SET NOCOUNT to OFF.

SET NOCOUNT OFF

GO

这里点到为止吧,具体的解释我想MS的帮助会比我说的更专业更清楚些,参考下吧。

VB对象关闭时,不允许操作

private

sub

command3_click()

pubconn.close

pubconn.open

strconn

你在这里把pubconn关闭了,而前面

rstable.open

strsql,

pubconn,

adopendynamic,

adlockoptimistic

使用

close

方法关闭

connection

对象还将关闭与连接相关联的任何活动

recordset

对象。

所以rstable也被关闭了,所以是对象关闭时,不允许操作。

vb.net怎么把对象真正的立即释放掉

.NET目前的垃圾回收机制不能实现把对象真正的立即释放掉,GC会对垃圾进行管理,如果垃圾没有引用计数了,就会被回收。

编码的时候能用托管类尽量用托管类去实现你的功能,

对于实现了IDisposable接口的类,用完了记得调用close或者Dispose又或者相应的方法去释放资源,最好吧使用using语句块;

对于Com对象,用完了先关闭,然后调用Runtime.InteropServices.Marshal.FinalReleaseComObject()方法把Com对象的引用计数设置为0。当 COM 对象的引用计数变为 0 时,通常会释放 COM 对象,不过这取决于 COM

对象的实现,而不是运行时可以控制的。最后调用ComObj = Nothing以释放ComObj持有的引用。不过要注意,只有当ComObj的生存期相对于垃圾回收器用于检测孤立对象的时间来说很长时,你才应该将变量设置为 Nothing。

有部分来自MSDN

怎样才能用VB.NET的代码来关闭一个在运行的程序

软糖来回答罗:通过System.Diagnostics命名空间下的Process类来关闭程序的进程

Dim 进程集合 = Process.GetProcessesByName("进程名称")

For Each 进程 In 进程集合

进程.Kill()

'进程.Close() '或者使用关闭

Next

也可以先获取所有进程,再来判断这些进程的名称ProcessName

Dim 获取本地所有进程 = Process.GetProcesses()

For Each 进程 In 获取本地所有进程

If 进程.ProcessName = "explorer.exe" Then 进程.Kill()

Next


文章标题:vb.net把对象关闭 vb不能关闭的窗口
本文路径:http://chengdu.cdxwcx.cn/article/hggihc.html