conn最好在程序结束的时候再关闭,而rs则在每一个查询的数据使用结束后就应该关闭
Public Sub main()这个改成Sub main()
--------
temp = "Provider=MicrosoftJetOLEDB40;Data Source=" & AppPath & "\cmmdb;Persist Security Info=False"
改成
temp = "Provider=MicrosoftJetOLEDB40;Data Source=" & AppPath & "\cmmdb;Persist Security Info=False;"
-----------
strsql = "select from User where UserName='" & userName & "'and UserPassword='" & userPass & "'"
改成
strsql = "select from User where UserName='" & userName & "' and UserPassword='" & userPass & "'"
重要的是,你的启动顺序有没有设置成从“Sub Main”启动。
连接数据库 如果采用的 ADONET 进行连接,默认情况下会有一个你看不见的 连接池 来管理这些连接,然后 你每次程序里的关闭数据库,只是把连接放回连接池,方便下次重新连接。
所以不用就关,避免连接池连接数过多。
不能更新。数据库或对象为只读。(错误 3027)
试图向以只读访问方式打开的数据库内保存更改。
这个数据库设定成只读可能是下列的原因之一:
使用 OpenDatabase 方法,且以只读方式打开数据库。
在 Microsoft Visual Basic 中,使用 Data 控件并把 ReadOnly 属性设置为 True。
数据库文件在 *** 作系统或网络中被定义成只读。
数据库文件存储在只读介质上。
在网络作业环境中,没有数据库文件的写入权限。
当数据库以加密方式工作时,数据库或它的对象(如字段或数据表)可被设置成只读。可能不允许以用户名称及密码去访问这个数据。
请关闭数据库,解除只读的条件,然后以读入/写入访问方式再打开文件。
vb6与数据库的连接方法很多,取决于你的目的,如果你主要是为了把数据按照传统的表格方式展现出来,那么你可以用dbgrid之类的控件,里面可以设置数据源,然后自动他就会自动获取数据源里面的信息并显示出来,也可以进行一些简单的数据修改 *** 作。如果你想要对数据进行比较复杂的程序处理,那么可以使用ado对象来连接和查询数据库,里面有一个recordset对象,可以对查询的结果进行遍历,分析等。
对access数据库加密一般都是使用access软件实现吧?我不清楚代码怎么实现,但是用软件就只需要在菜单 *** 作就可以了。具体来说就是文件菜单选择打开,在”打开“后面的下拉式莱单中选为独占模式打开,这样打开文件后,使用工具菜单里面的安全,里面就有设置数据库密码
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的帮助会比我说的更专业更清楚些,参考下吧。
引用DAO36
dim a() as string
dim b() as string
dim c() as string
dim d() as string '数组声明
dim dt as database
dim rs as recordest
dim i as variant
set dt = opendatabase("数据库地址") '打开数据库
set rs = dtopenrecordest("学生表",dbopendynaset) '打开表
do until rseof ‘当指针在最后一行时退出循环
a(i) = rs("学号")
b(i) = rs("姓名")
c(i) = rs("性别")
d(i) = rs("年龄")
rsmovenext '指针向下移
i = i + 1
rsclose '关闭表
dtclose '关闭数据库
loop
以上就是关于vb 3705 对象打开时不允许 *** 作 求教 看到好多实例都说这个问题是没有关闭数据库 但我关闭了呀。。。在线等全部的内容,包括:vb 3705 对象打开时不允许 *** 作 求教 看到好多实例都说这个问题是没有关闭数据库 但我关闭了呀。。。在线等、vb.net连接数据库的是每次要 *** 作数据的时候就打开数据库,不 *** 作的时候就关闭。、关于VB 3027错误 请高手帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)