分享
 
 
 

Visual Basic常见问题解答

王朝vb·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

那里可以获得最新的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]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有