Dim conn as adodb.connection
Dim rst as adodb.recordset
'其他操作
......
'开始数据库操作
set conn=createobject("adodb.connection")
set rst=createobject("adodb.recordset")
Dim rst as adodb.recordset
'其他操作
......
'开始数据库操作
set conn=createobject("adodb.connection")
set rst=createobject("adodb.recordset")
解决方案 »
- vb关于文本文件操作
- FindWindow-获得excel的book1.xls的句柄写法?
- RegOpenKeyEx老是调用不成功,返回值是5
- 跪求:调试过程中从当前运行Form切换到当前Form的源代码编辑窗口的快捷键
- 请各位高手鼎力相助?分是没有问题的,我现在手上有3千多分!
- 有哪位能人可提供MD5与RSA算法的模块程序???
- 请问程序发布的问题
- 恳请赐教(有关计算器的问题)
- 哪位有Video Soft FlexGrid 的正式版吗?
- 请教:在VB中如何通过ADO访问存储过程?
- 请问如何实现:鼠标拖动文件到窗体中,此文件路径会自动加入listbox中?
- 请问在vb中,模块和类模块有什么不同?谢谢!
Dim rst as adodb.recordset
set conn=new adodb.connection
set rst=new adodb.recordset
dim rs_addcondition as adodb.recordset
set rs_addcondition = new adodb.recordset
rs_addcondition.ActiveConnection = conn
rs_addcondition.Source = "SELECT * FROM aaa"
rs_addcondition.CursorType = 0
rs_addcondition.CursorLocation = 2
rs_addcondition.LockType = 3
rs_addcondition.Open()
rs_addcondition_numRows = 0
Dim rst as adodb.recordset
Dim SqlStr as String
set conn = new Adodb.Connection
conn.open"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库名称;Data Source=服务器名称
SqlStr = "select * from 表"
Set Rst=New Adodb.RecordSet
rst.open SqlStr, conn, adOpenKeyset, adLockOptimistic
Dim conn as adodb.connection
Dim rst as adodb.recordset
set conn=new adodb.connection
set rst=new adodb.recordset 不要写成Dim conn as new adodb.connection,关键字new不要在声明时写。
原因想不起来了,好象差别很大。
有一本白色封皮的《Visual Basic 6编程技术大全》(作者Francesco Balena)上有相关解释,这是一本好书,推荐大家收藏。(我可不是推销员哦)
Dim Rs1 As New ADODB.Recordset
Dim strSQL as String
Cn1.Open "ODBC_NAME"
strSQL="...."
Rs1.Open strSQL,Cn1,adOpenKeyset, adLockOptimistic
..
Rs1.Close
Set Rs1=Nothing
Cn1.Close
Set Cn1=Nothing
Dim conn as adodb.connection
Dim rst as adodb.recordset
set conn=new adodb.connection
set rst=new adodb.recordset New关键字不要用在声明中,应该先声明,再用set aa=new obj的形式,不要Dim conn as new adodb.connection。好象差别很大。
原因记不起来了。好象在《Visual Basic 6编程技术大全》(作者Francesco Balena)中有详细说明。这是本好书,讲得很深,值得收藏。(不要拍板砖,我可不是推销员)。奇怪,刚才明明发出回复了,为什么显示不出来?害得我又写了一次。
set conn=createobject("adodb.connection"),
只能用set conn=new adodb.connection。
set conn=createobject("adodb.connection")的写法只能用在asp上我坚信洋人书上写的,因为我们在学洋人的东西。
可能的话不用控件,都用代码(建立对象实例),缺省值以外的属性都用代码写
是在声明时就创建了对象的实例
dim cnn as adodb.connect
set cnn=new adodb.connect
是在使用时创建实例。
两者使用上是完全没有区别的,只是对内存的申请有所不同。不能说孰优孰劣,视具体情况而定。
哪本洋书上胡说八道的。谁说VB中不能用CreateObject创建ADO对象的。只不过效率上比 Set New方式低一点而已。但又不是在大循环中(我想大概不会有人这么做的吧)创建,影响不大。相反,如果是在公用模块的公用函数中,我更喜欢使用CreateObject创建ADO对象,因为这样做工程可以不必事先引用ADO库,公用函数可以方便地进行移植。To firechun(天火):(探讨一下)
DIM cnn as new ADODB.Connection 好象是在对cnn的第一次调用创建对象的。可以做个测试,用Dim New 方式定义一个引用Active Dll工程的对象变量,进行单步跟踪运行,会看到只有在对变量进行调用时对象初始化事件才发生。当然,我只是个猜测,这并不表明这时才进行内存分配,可能是你所说在声明时就已经分配了内存。
使用dim cnn as new adodb.connection还是set cnn=new adodb.connection,我记得还是在99年时和公司的同事讨论过,当时讨论的意见是使用前者较好,具体的原因我忘了.:( (人老记性差,连connection都写成connect),你做的测试应该没问题(我没做),但确实不能说此时才进行内存分配,因为内存的分配应该不会涉及到对象的初始化。new操作符来自于C++,我记得在内存的分配上C++好象提到过。
这一两年编码较少,对这些纯理论上的东西关注的也较少了,事实上99年那次的讨论也是源于当年的ms tech大会上对这个问题有过阐述,因此引发了同事之间的争议。
另:写完上面的话,查了一下MSDN,rnadom说得不错,dim cnn as new adodb.connection是第一次调用时创建对象的,不过上面没说内存分配的情况.:(
vb会在第一次调用该对象的时候初始化该对象,这种技术使得无需手工初始化一个对象。缺点是:有一个ClassA,其中Initlize方法中连接了某一个数据库,如果使用了As New方法来定义一个ClassA实例,使用ClassA.DoSomeWork的时候。如果数据库服务器不可用ClassA会返回一个奇怪的错误,如果没有ClassA的源码进行调试会让人很头疼的。
你的问题我一个一个来回答吧!
1。对于全局调用问题!
可以在全局模块中申明如:
Public Connection As ADODB.Connection '定义一个数据源的联接
Public recordset As ADODB.recordset '定义一个记录集 这样只要在程序最开始打开connection 就能在全局使用了!!2。运用ado连接数据库有很多方法!!
A.直接用adodc控件
所有属性在控件中设置好!
优点:方便,简洁。不用代码就能实现
缺点:不够灵活,如在运行对adodc的Datasource更改后都要用refresh方法,这有可能产一个可捕捉的错误,我怎么都避免不了
B.运用代码:
a.用大家常用的recordset
Dim conn as new adodb.connection
Dim rst as new adodb.recordset
conn.open"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库名称;Data Source=服务器名称
set rst= new adodb.recordset
rst.open "select * from 表", conn, adOpenKeyset, adLockOptimistic
优点:对数据源的控制可以做到非常的细致!(包括:读写属性,游标状态,数据库路径。都可在程序运行是更改!!非常有用)
缺点:除了要写的多点也没什么。还有就扫尾工作多点,如:记录集用完后要rst.close
然后 set rst = nothing ,以释放内存 b.直接用connection的execure方法,不调用记录集recordset。如:
'假设connection已经打开!
strSQL = "select * from 企业产品表"
Set 对象控件.DataSource = connection (strSQL)
这时,connection.execute (strSQL)就相当于是一个recordset!
如果你并不需要和对象控件的datasource相连,而只是想完成一个不需要显示记录的动作比如,添加一个记录、删除一个记录、更新一个记录就只要这样写
strSQL = "select * from 企业产品表"
connection.execute strSQL
就可以了!!
优点:非常的方便,而且容易在运行时控制!
缺点:用.execute方法打开的记录都是只读的属性!如果要实现数据的即时修改、更新,还必须用recordset!
以上是我个人的一点经验和看法!
我觉得vb在初始话的时候已经对程序中声明的变量,对象进行了内存分配!
只是用到new命令时创建了对象!所以把new命令放到声明语句中的好处就是一举2得!
使代码简洁!new命令应该是从c中来的,而在c中new指令,仅仅是对所创建的对象赋给一个指针
内存是用程序自己以占用的内存。而不是新的系统内存中划出来的。以下是msdn的原文:
“The new operator is used to allocate objects and arrays of objects. The new operator allocates from a program memory area called the “free store.” ”
Dim A AS Class1
Dim B As New Class1Set A=New Class1 'A Begin Init
Debug.Print A.Caption
Debug.Print B.Caption 'B Begin Init
Set A=Nothing
Set B=Nothing
Debug.Print B.Caption 'B Init
Debug.Print A.Caption 'Error
(假设Class1有Caption属性)关于Connection对象,我的意见是全局共享(MS也推荐),因为他消耗很多的资源,当然,如果你使用COM+,MS会又推荐你使用时"创建",用完后立即“释放”,我也统一这点,这里COM+本身并不真的释放了对象,而是缓冲了,这对于非常多的用户是非常有用的。
Recordset我是极力不推荐全局共享的,很简单,他是用BookMark工作的,任何其他的代码都可能移动指针,而造成无法预测的错误。如果你真的要共享记录的数据可以将数据放到全局的数组中,(利用GetRows方法)以上是我的拙见,希望交流