Dim Conn As SqlConnection = New SqlConnection(ConfigurationSettingsAppSettings("ConnStr"))
dim strSQL as string="Select Count(ID) AS Nub from [xxx]"
dim Cmd as new SqlCommand(strSQL,Conn)
Connopen()
dim iCount as integer=SqlCommandExecuteScalar() '计算记录的个数
Connclose()
VB中“对象关闭时,不允许 *** 作”解决方案
最近两天在VB里弄一些小程序,好久没接触了,感觉有些陌生了,还算有点基础吧,遇到一些小的难题基本上都能解决。不过,这下真的遇到难题了,琢磨半天硬是没弄出结果来,在网上查资料也没个底,如同大海捞针呀,关键是没一点正经的答案和可行的方案。
问题是这样的,在VB中执行存储过程,想输出返回值并将数据绑定到DataGrid控件中,本来是件小菜的问题,在NET、ASP里都做通过,但在VB里却是折磨了半天也没弄出来。还是自己动手吧,有问题就得想办法,一步步来吧。
先在SQL 2000中写好存储过程了,(这里不再写出存储过程的具体代码了,也就是一个返回值,一个记录集)然后在VB中引用ADO对象,输入如下代码,以调用存储过程:
Dim lackconn As New ADODBConnection
lackconnConnectionString=Provider=SQLOLEDB1;Persist Security Info=False;User ID=sa;Password=boyd;Initial Catalog=mydb;Data Source=(local)
lackconnCursorLocation = adUseClient '设置为客户端
lackconnOpen
Set lackcmd = New ADODBCommand
lackcmdActiveConnection = lackconn
lackcmdCommandText = myproc '这里为存储过程名称
lackcmdCommandType = adCmdStoredProc '指定为存储过程
Set param = lackcmdCreateParameter(@num, adInteger, adParamReturnValue, 4) '@num为返回值
lackcmdParametersAppend param
Set lackrs = New ADODBRecordset
Set lackrs = lackcmdExecute()
msgbox 站点总数: & lackcmdParameters(@num)Value & 个
Set mydatagridDataSource = lackrs 'mydatagrid为对象名称
mydatagridRefresh '刷新DataGrid
'下面关闭数据库对象等略去
就这样的一个简单的代码,一运行就出错,提示错误在“Set mydatagridDataSource = lackrs”,错误就是“对象关闭时,不允许 *** 作”。郁闷ing,这哪来的错误呢?我根本没关闭数据库连接,其他内容也是没有问题的呀。花了很长时间没能解决,大清早再打开电脑时,灵机一动,搞定了。这里将这种现象作下总结,顺便记录一下本次解决过程。
产生这种现象有几种原因:
1、数据库对象连接被关闭了,这肯定会报错的,当然也不能输出任何结果的,这时只需注意“先使用、后关闭”就行了,解决这样的问题就是暂时先不要关闭数据库连接就行了。
2、返回记录为空时,也会报错。如下面的代码
sql = select from dbcn where 状态='0'
Set rs = connExecute(sql)
If Not rsEOF Then
For m = 1 To rsRecordCount
List_statusAddItem rs(1) & ( & rs(2) & ): & rs(4)
rsMoveNext
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的帮助会比我说的更专业更清楚些,参考下吧。
1、出库所有记录并用循环累加符合要求的记录是不可取的。
2、vb获取符合要求的记录数,需要 *** 作数据库的sql语句一次来完成:
select
count()
from
yourTable
where
field=condition
3、查询得到记录集里将返回符合要求的记录数。
比如要获得五行数据 ;;select top 1 from (select top 5 from 表 )a order
by 字段 一段sql 写在你调用的sql语句里面,,,获取的就是第五行数据了;;;够详细吧,,,,
可以,用Adodc控件执行SQL指令,错误时会出现提示。只不过你弄错了一点:VB执行SQL命令并不是提交给SQL查询分析器执行的,而是提交给微软数据库引擎Microsoft JET (Joint Engineering Technologe) ,即使电脑没装SQL客户端,有了数据库引擎也可以进行数据库 *** 作。所以VB出现的错误提示和查询分析器不一样,没有它那么详细。
以上就是关于vb.net查询SQL中记录的条数全部的内容,包括:vb.net查询SQL中记录的条数、VB执行SQL语句的问题、VB怎么判断SQL插入记录条数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)