首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB操作数据库的有关问题

2012-01-16 
VB操作数据库的问题我先定义了两个全局变量Public PCN As New ADODB.ConnectionPublic REC As New ADODB.R

VB操作数据库的问题
我先定义了两个全局变量
Public PCN As New ADODB.Connection
Public REC As New ADODB.Recordset

连接数据库
conn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID= 'sa';password='';Initial Catalog='Door';Data Source="
PCN.Open conn

查询按扭代码
REC.CursorLocation = adUseClient
REC.Open "select * from users", PCN
Set VSFlexGrid1.DataSource = REC
REC.Close

增加记录按扭代码
If Not REC.State = adStateClosed Then
REC.Close
End If

REC.CursorLocation = adUseClient
REC.Open "Insert into Users values('111', 'ning', '3', 0, 'sddsd ')", PCN
'如果放开下面代码,就会出现对象关闭时,不允许操作
'REC.Close

问题:
1。为什么查询之后,close没有问题。而在增加记录后,不能执行close,不然会出错。我感觉recordset用完之后,应该close才对。
2。我对这段代码不太了解,也是在网上找的。谁能帮我解释一下,应该怎么写最完美?
REC.CursorLocation = adUseClient'这个属性有什么用,还有哪些属性要设置?
If Not REC.State = adStateClosed Then REC.Close’这句话好像没什么用?我调试时,看到这段代码好像并没有执行。
REC.Open "select * from users", PCN’这句话后面的参数是干什么的,我在网上看到还有其它写法,哪些是有用的,哪些是没用的?
3。PCN.Execute ("select * from users")
这句话也能执行,但是它跟recordset的open语句有什么区别?怎么遍历它返回的记录?
注:小弟是初学。请多指教。

[解决办法]
增加用:
pcn.execute "Insert into Users values('111', 'ning', '3', 0, 'sddsd')"
[解决办法]
lz应当看看ado方面的书,问题不少.
1.If Not REC.State = adStateClosed Then REC.Close 是判断记录集运行状态,防止出错

2.REC.CursorLocation = adUseClient 是设置游标类型
在Recordset对象还有一个属性CursorLocation用于指定游标的位置,我们可以指定使用客户端的游标,也可以指定使用服务器端游标。CursorLocation属性的缺省值为adUseServer,使用服务器端游标的好处是,程序对数据库的修改可以立即反映到服务器,而且,其他用户对数据库的操作也可以马上反映出来,但使用服务器端游标带来了高网络流量,每一个数据访问都需要通过网络交换数据。

ADO提供了客户端数据缓存处理,因此,在打开Recordset对象前,可以设置CursorLocation为adUseClient,指定使用客户端游标。通过客户端游标,ADO利用本地数据缓存以降低网络流量,虽然在数据访问灵活性上有所损失,但却大大提高了通过网络访问数据库的性能。

3.PCN.Execute 跟recordset的open语句有什么区别
一般不需要返回记录的用Execute,否则用open
[解决办法]
1) INSERT 语句没有返回记录,所以 Open 其实是没有正真成功(指获取记录的目的没有成功),既然 Open 不成功,那么调用 Close 当然会出错。

3) Connection.Execute() 返回的记录集只能是只读、仅向前的,而 RecordSet.Open() 可以通过参数指定可读写性、游标的方式等。
[解决办法]
2,from MSDN:
adUseClient 使用由本地游标库提供的客户端游标。本地游标引擎通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。adUseClientBatch 与 adUseClient 同义,也支持向后兼容性。 
adUseServer 默认值。使用数据提供者或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。 

简单点说,adUseClient 在操作上功能多些,但更新没那么及时
3,同样是查询,"select * from users", REC.Open 还可以指定LockType,比如锁定数据不让别的用户更改. 一般来说,当你的程序要考虑到多用户操作,或是数据库事务处理时,则要注意选用合适的方式做合适的事.
而且,那些参数的使用,还会因数据库类型不同而有细微区别,比如orale和mssql就有一些区别
[解决办法]

引用 MSDN:
Open 方法 (ADO Recordset)

打开游标。

语法

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

参数

Source 可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。

ActiveConnection 可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。

CursorType 可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型。可为下列常量之一(参阅 CursorType 属性可获得这些设置的定义)。

常量 说明
AdOpenForwardOnly (默认值)打开仅向前类型游标。
AdOpenKeyset 打开键集类型游标。
AdOpenDynamic 打开动态类型游标。
AdOpenStatic 打开静态类型游标。


LockType 可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值,可为下列常量之一(参见 LockType 属性可获得详细信息)。

常量 说明
AdLockReadOnly (默认值)只读 — 不能改变数据。
AdLockPessimistic 保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
AdLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。
AdLockBatchOptimistic 开放式批更新—用于批更新模式(与立即更新模式相对)。




Options 可选,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。可为下列常量之一(参见 CommandType 属性可获得该列表中前五个常量的详细说明)。

常量 说明
adCmdText 指示提供者应该将 Source 作为命令的文本定义来计算。
adCmdTable 指示 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行。
adCmdTableDirect 指示提供者更改从在 Source 中命名的表中返回所有行。
adCmdStoredProc 指示提供者应该将 Source 视为存储过程。
adCmdUnknown 指示 Source 参数中的命令类型为未知。
adCmdFile 指示应从在 Source 中命名的文件中恢复保留(保存的)Recordset。
adAsyncExecute 指示应异步执行 Source。
adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用。
adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动移到文件末尾。


说明

使用 Recordset 对象的 Open 方法可打开代表基本表、查询结果或者以前保存的 Recordset 中记录的游标。

使用可选的 Source 参数指定使用下列内容之一的数据源:Command 对象变量、SQL 语句、存储过程、表名或完整的文件路径名。

如果 Source 是文件路径名,它可以是完整路径(“c:\dir\file.rst”)、相对路径(“..\file.rst”)或 URL(“http://files/file.rst”)。

ActiveConnection 参数对应于 ActiveConnection 属性,并指定在哪个连接中打开 Recordset 对象。如果传送该参数的连接定义,则 ADO 使用指定的参数打开新连接。可以在打开 Recordset 之后更改该属性的值以便将更新发送到其他提供者。或者可以将该属性设置为 Nothing(在 Microsoft Visual Basic 中)以便将 Recordset 与所有提供者断开。

对于直接对应于 Recordset 对象属性的参数(Source、CursorType 和 LockType),参数和属性的关系如下:

在 Recordset 对象打开之前属性是读/写。


除非在执行 Open 方法时传送相应的参数,否则将使用属性设置。如果传送参数,则它将覆盖相应的属性设置,并且用参数值更新属性设置。


在打开 Recordset 对象后,这些属性将变为只读。
注意 对于其 Source 属性被设置为有效 Command 对象的 Recordset 对象,即使 Recordset 对象没有打开,ActiveConnection 属性也是只读的。

如果在 Source 参数中传送 Command 对象并且同时传递 ActiveConnection 参数,那么将产生错误。Command 对象的 ActiveConnection 属性必须已经设置为有效的 Connection 对象或者连接字符串。

如果在 Source 参数中传送的不是 Command 对象,那么可以使用 Options 参数优化对 Source 参数的计算。如果没有定义 Options 则性能将会降低,原因是 ADO 必须调用提供者以确定参数是否为 SQL 语句、存储过程或表名。如果已确定所用的 Source 类型,则可以设置 Options 参数以指示 ADO 直接跳到相关的代码。如果 Options 参数不匹配 Source 类型,将产生错误。

如果不存在与 Recordset 关联的连接,Options 参数的默认值将为 adCmdFile。这是持久 Recordset 对象的典型情况。

如果数据源没有返回记录,那么提供者将 BOF 和 EOF 属性同时设置为 True,并且不定义当前记录位置。如果游标类型允许,仍然可以将新数据添加到该空 Recordset 对象。

在打开的 Recordset 对象上完成操作时,可使用 Close 方法释放任何相关的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在以后使用 Open 方法再次将其打开。要将对象从内存中完全删除,可将对象变量设置为 Nothing。

在设置 ActiveConnection 属性之前调用不带操作数的 Open,可通过将字段追加到 Recordset Fields 集合创建 Recordset 的实例。

如果已经将 CursorLocation 属性设置为 adUseClient,就可以采用两种途径之一异步检索行。建议使用的方法是将 Options 设置为 adAsyncFetch。或者,可以使用在 Properties 集合中的“异步行集合处理”动态属性,但如果未将 Options 参数设置为 adAsyncFetch,则可能丢失相关的被检索事件。


[解决办法]
看看ado帮助 http://www.microsoft.com/data/ado

热点排行