那里可以获得最新的MDAC?
目前MDAC2.5已经正式发布, 如果安装了Windows 2000那么它将自动安装在您的计算机上, 您也可以从微软网站上下载最新的MDAC 2.5 RTM 版本,网址如下:http://www.microsoft.com/data/download_250rtm.htm。
我查询 ADO recordset的RecordCount属性总是返回 -1。
在ADO 1.5版本时当我们用adOpenForwardonly 游标类型打开记录集时,RecordCount属性返回 -1,在ADO 2.0, 2.1和2.5版本时用adOpenDynamic类型也会发生这种情况。因此如果要访问记录集的RecordCount属性,请使用adOpenKeyset 或 adOpenStatic作为Server端的游标或使用客户端的游标打开记录集。另外请注意使用的LockType,有些LockType会强制改变游标类型。如果数据供给程序不支持你所设的游标类型,数据供给程序可能会使用一种相近的游标作为替换,也造成游标类型的改变,请同时参照数据供给程序的文档。
为何我希望调用App.LogEvent方法将调试信息写入Windows NT的事件日志(Event Log)中,但我在调试时始终看不到有任何内容被写入。
这个功能仅对编译过的VB程序起作用,如果你在VB环境下执行,该语句会被忽略。为了在VB环境调试时也能使用该功能,你可以用VB编写一个ActiveX DLL组件,此组件公开一个方法用于写事件日志,将其编译后供你的VB程序调用。
VB能否编写Windows NT/2000的服务程序(Service)?
Service程序一般都要在后台长期的运行,因此安全、稳定、健壮是Service程序的基本要求,这也要求一种更接近操作系统的语言来开发Service程序。Visual Basic 是一种高级编程语言,一般情况下我们需要使用ActiveX 组件来实现程序功能,但是我们往往不能清楚的了解到这些组件的具体实现细节,因此VB并不适合于开发Windows NT/2000的服务程序,而Visual C++则是一种较合适的语言。微软公司目前不推荐,也不支持用VB开发服务程序。
VB6.0是否支持继承,多态?
继承分为实现继承(implementing inherit) 和接口继承(Interface inherit), VB6.0的类模块提供接口继承的支持。使用implements 语句能实现接口继承。 VB6.0程序中能将子类赋于父类实现多态, 事实上它是通过对父类接口的查询(QueryInterface)来实现多态。
VB6.0创建的ActiveX DLL/EXE是否支持MTA?
VB6.0创建的ActiveX DLL的线程模式是STA或Thread-Oblivious, 任何MTA客户访问组件前必需创建一个新的线程,由新线程进入STA创建对象,然后返回接口代理。ActiveX EXE 的Thread Pool 也不是MTA,每一个新对象的创建都存在一个新的STA中,直到线程数量达到Pool的设定值。
如何在VB中使用ADO SHAPE Command 实现分层记录集?
分层记录集通过客户端游标引擎实现的MSDataShape provider提供数据。层次结构的记录有点类似于使用JOIN 和 GROUP BY 的SQL 语句,但又有不同,后者返回的记录集包含了主表和从表的字段,而前者的记录集仅含有主表的字段,另外,这个记录集也含有一个附加的字段代表相关从表的数据,你可以将它赋给另一个记录集变量。当你为统计功能使用GROUP BY 和统计函数时,统计值总出现在记录集上,而使用分层记录统计信息会出现在主记录集上而子记录集还保存着子记录的详细内容。
有三种类型的SHAPE可供选择,基于关系的(Relation Based),基于参数的(Parameter Based)和基于组的(Group Based) 语法如下:
SHAPE {parent-statement}
APPEND Aggregate
| ({child-statement} [As Alias]
RELATE parent-field TO child-field | parameter-marker
[, parent-field TO child-field | parameter-marker ...])
[, Aggregate | ({child statement})...]
SHAPE {non-normalized-statement} [AS Alias]
COMPUTE Aggregate
| Alias
| ({child-statement} [As Alias] RELATE parent-field TO
child-field | parameter-marker)
[, Aggregate | Alias | ({child-statement}...)]
[BY grouping-field ][, grouping-field]]
SHAPE {non-normalized-statement} [AS Alias]
BY grouping-field [, grouping-field]
详细信息请查阅:msdn\knowedge Base : Q189657
VB如何访问TAPI?
由于TAPI 2.X的大多数函数是基于异步方式,VB仅提供有限的支持。随着Windows 2000和TAPI 3.0的发布,VB已能用其公开的COM对象模型提供很好的支持。
我用VB开发了一个ActiveX EXE,其中包含了多个Class模块,但为何在DCOMCNFG..EXE中只看到一个Class。
DCOM提供了Server级的安全特性,所有在同一Server内的对象共享一个安全设置因此我们在DCOMCNFG..EXE中只能看到每个ActiveX EXE的第一个对象(Class)。
VB调用C DLL时的参数传递问题。
首先必须了解此函数在C中的原型,包括参数类型和传递方式。下表显示了常见的转换规则。
C DLL 原型
VB声明
VB调用
int a
long a
ByVal a as long
Call func(…,a,…)
ByRef a as long
Call func(…,byval a,…)
int *pa
long *pa
ByRef pa as long
Call func(…,pa,…)
ByVal pa as long
Call func(…,varptr(pa),…) *(1)
Char *pstr
wchar *pstr
ByVal pstr as string
Call func(…,pstr,…) *(2)
ByRef pstr as string
Call func(…,byval pstr,…)
struct tagX *p
ByRef p as tagX
Call func(…,ptag,…) *(3)
HANDLE h
ByVal h as long
mso-bidi-font-family: Call func(…,h,…) *(4)
注意:
我们不推荐使用此方式,
如果DLL要接收一个字符串缓冲,一定要在调用前初始化字符串,
用户子定义类型必须用ByRef方式传递,
任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象句柄都能用此方式传递。
API Viewer 能帮助我们声明API函数, 我们可以更据需要修改参数传递方式。
为什么我在使用RDS时经常会遇到下面一些错误:
4099 800A1003 Unable to connect to server.
4100 800A1004 Unable to create business object.
4101 800A1005 Unable to invoke method on business object.
4351 800A10FF Unexpected error.
8447 800A20FF Internet Server error.
你需要配置IIS和RDS:
配置IIS: 将IIS虚拟目录MSADC设为可执行(Execute (Including Script)), 如果允许匿名访问需要对匿名用户账号设置相应权限。另外,如果IIS设置了IP 过滤,需要根据你的网络设置进行相应修改。
Handle 设置: 在一些情况下,RDS的安全特性是被设为禁止的,如果你不设置handler, RDSServer.DataFactory不会工作. 所以你需要handler. 可以双击MSADC目录下的Handunsf.reg文件。它会修改注册表,开起安全特性,允许RDSServer.DataFactory工作。
如何使用ADO访问加密的Access数据库?
如果你希望打开一个有口令保护的Access数据库,你可以用以下三种语法的任一种:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Properties("Data Source") = "C:\...\JetPassword.MDB"
MyConn.Properties("Jet OLEDB:Database Password") = "MyPwd"
MyConn.Open
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Data Source=C:\...\JetPassword.MDB;" & _
"Jet OLEDB:Database Password=MyPwd"
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Open ConnectionString:=strConn
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Data Source=C:\...\JetPassword.MDB;" & _
"Jet OLEDB:Database Password=MyPwd"
MyConn.Open ConnectionString:=strConn
如果你打开一个数据库使用了Jet安全保护,你需要使用以下方式:
Dim MyConn As New ADODB.Connection
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Properties("Data Source") = "C:\...\JetSecurity.MDB"
MyConn.Properties("Jet OLEDB:System database") = "C:\...\System.MDW"
MyConn.Open UserID:="Admin", Password:="MyPwd"
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Data Source=C:\...\JetSecurity.MDB;" & _
"Jet OLEDB:System database=C:\...\System.MDW"
MyConn.Provider = "Microsoft.Jet.OLEDB.3.51"
MyConn.Open ConnectionString:=strConn, _
UserID:="Admin", Password:="MyPwd"
-或-
Dim MyConn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.3.51;"
"Data Source=C:\...\JetSecurity.MDB;" & _
"Jet OLEDB:System database=C:\...\System.MDW"
MyConn.Open ConnectionString:=strConn, _
UserID:="Admin", Password:="MyPwd"
注意:Jet 3.51 OLEDB provider 被设计用来打开Access97数据库,如果你要打开Access 2000 请使用Jet 4.0 OLEDB provider,当然Jet 3.51 OLEDB provider也能打开Access 97。
如果你希望使用Jet 4.0只要将Microsoft.Jet.OLEDB.3.51换成Microsoft.Jet.OLEDB.4.0
我用VB编写程序发布到某些计算机上出现运行时错误: ""-2147217872 (80040e30) :The given type name was unrecognized"。但是在某些机器上却运行正常。我的程序调用了SQL Server7.0的存储过程。在某些运行正常的机器上已安装了Access 2000, 而出错的机器上安装的是Access 97。请问这个错误会不会是与Access有关?
SQL Server 7.0 有SQL Server 6.5不具备的新数据类型:nChar, nVarChar, 它们是Unicode型字符。如果要在VB程序中调用以这些数据类型为参数的存储过程,就需要将旧版本的MDAC升级MDAC2.1或MDAC2.5。新版的MDAC可以在http://www.microsoft.com/data中找到并下载。因为安装Access 2000时会同时安装MDAC2.1,因此你的程序能够在安装Access 2000的机器下正常运行。
我用VB编写程序发布到某些计算机上,在连接Access数据库时出现运行时错误"3706: ADO could not find the specified provider",这是什么问题?
MDAC 2.0会安装Jet OLE DB provider 3.51版本。MDAC 2.1会安装Jet OLE DB provider 4.0版本,但如果机器上已经安装了3.51版本,MDAC 2.1不会删除也不会覆盖旧的3.51版本,这就使节3.51和4.0同时存在与你的开发机上。当连接Access数据库时,Jet OLE DB provider需要检查provider的版本号。而你在制作安装包时仅包含了MDAC 2.1,目标机上自然不可能有Jet OLE DB provider 3.51版本被安装,这就是错误发生的原因。此时你需要修改你的程序,使其使用4.0的Jet OLE DB provider。 [/B]