Rya*_*yer 4 .net sql-server vb6
我被赋予了修改VB6项目的任务.没有什么是非常严重的,添加了几个表单并修复了一些bug.该项目使用SQL Server(如果有任何相关性).
我在编程方面的背景是VB/C#.NET,PHP,C++和MySQL,尽管我使用的SQL Server规模要小得多.任何人都可以给我什么样的建议或VB6编程的资源.自从我完成任何VB .NET工作已经有几年了,虽然我可以阅读VB6代码并了解发生了什么,但我不确定我能够开始写作和/或修改没有破坏任何东西的机会.
别人可以提供什么样的建议?任何资源和/或故事都会很棒.随意提供你可能感觉相关的东西,但我忽略了.
谢谢!
Con*_*lls 13
VB6有一个破碎的类型系统 - 实际上它有两个不完全兼容的类型系统.在架构上,VB4-6是一个比COM更薄的包装器,并使用COM的类型系统.VB的早期版本有自己的类型系统,它是传统BASIC和C之间的交叉.两者不能自由混合和匹配.
没有继承,也没有真正的异常处理,所以期望为错误处理和反复重复的基本表单函数编写大量的样板代码.这就是VB获得剪切和粘贴软件工程的声誉.
您可以在VB中声明的某些类型不是"自动兼容",这意味着它们不能在COM边界上序列化或存储在Variant中(稍后将详细介绍).这些类型可以追溯到VB不支持COM的VB4-6之前的日子.其中一种类型是记录(如ac结构)类型,其名称会使我逃避,因此结构的可扩展集合或关联数组(这是人们可能想要做的自然事情)是不可能的.定义一个类(见下文)是可能的,但有点笨拙.
VB不支持多线程,其解决方法有许多问题.如果您使用MTS或COM +进行3层开发,第一个可能会咬你.创建VB模块实际上是在幕后创建一个单独的COM对象.这将住在自己的单线程公寓.公寓本质上是轻量级运行COM服务器,具有序列化/反序列化机制(称为消息泵),其中调用被序列化并排队等待单个线程.如果您(在表面上)做了明智的事情并尝试模块化您的代码,您将在您的中间层创建热点.解决方案:更多剪切和粘贴.
第二个主要问题是COM的垃圾收集是相当基本的 - 一个简单的引用计数机制.这意味着COM组件崩溃或由于某种原因在自身泄漏内存后没有整理.还记得VB6如何只是COM上的薄层吗?这种紧密耦合意味着在使用UI管理代码时必须非常小心,该代码保存对控件的引用,外部应用程序上的OLE自动化(例如Excel)或任何其他设置引用的内容.VB很擅长做背后隐藏的东西而不知道什么时候自己清理.它也是幕后产生的循环引用的来源.得到这个错误,它会泄漏资源 - 你需要小心这一点.
另一个主要问题是变种.我见过的Variant类型的最佳描述是'Spreadsheet Cell'.这些可能会造成很多恶作剧,特别是Variant Arrays.许多API仅适用于变体或具有使用变体的随机部分(Excel会执行此操作),因此您无法始终避免使用它们.如果你在COM边界上串行化(例如多个断开连接的Recordset),你很快就会学会厌恶Variant Arrays.
您可能会发现VB的类型系统如此破碎,以至于维护非平凡复杂数据结构的最简单方法是执行一个库,该库以字符串形式对其进行编码,并基本上对其进行串行化和反序列化.VB6应用程序中的复杂数据结构几乎不是起始者.
最后,在使用VB6的GUI工具包之后,您将了解到WinForms团队从VB6团队的错误中学到了多少.
虽然它被宣传为简单易用,但是由于所有的架构缺陷和小问题,在VB中构建一个非平凡的应用程序而不会弄得一团糟.这是Spolsky的Leaky抽象定律的一个很好的例子..
Appleman 在Visual Basic 6中开发COM/ActiveX组件对COM与VB6交互的细节有很好的处理.他在Win32和VB编程方面也做得很好..
PS(谢谢你提醒我Daok),如果你发现有人一直在使用On Error Resume Next,你有我的许可,头撞他们.
因为我在Visual Basic上切了我的话(简历说VB3-6 10多年),我会尝试用"On Error Resume Next"以外的东西来回答你的问题(它确实如此,但你会发现它)到处都是,或者你不会,这更糟糕).您可以执行以下操作:
关于Visual Basic一般来说,我会说不相信反炒作.它是一种允许良好代码或错误代码的语言,与其他语言非常相似.请记住,所有可怕的VB程序员现在都是可怕的C#程序员.
如果您的应用程序使用ActiveX DLL项目,那么您确保这是最小化DLL地狱的情况
尽管缺少继承,您会发现VB6能够实现许多常见的面向对象设计模式.如果您查看设计模式,可重用面向对象软件的元素,您将看到大多数模式涉及实现接口而不是继承行为.他们从第16页开始讨论这个问题.
强类型集合不是直接实现的,您可以使用包括readonly Item属性在内的所有内容编写集合.完成后,您需要点击{F2}并调出对象浏览器.找到您创建的集合类,然后右键单击Item.
你需要
然后Item将成为默认属性,Strongly类型集合将按预期运行.
要在集合类上启用For Each,您需要添加它
Public Property Get NewEnum() As IUnknown
Set NewEnum = mCol.[_NewEnum]
End Property
Run Code Online (Sandbox Code Playgroud)
mCol是私有Collection变量的名称
再次使用对象浏览器并右键单击NewEnum.
你需要
请记住,Integer是16位,Long是32位.我建议将大多数整数变量声明为Long.在当天,它对于速度和内存占用至关重要,但对于今天的计算机,最好只使用Long而不用担心超出限制.
像其他地方建议使用Option Explicit.
Visual BASIC 6非常擅长隐式类型转换.如果您想确定,您可以使用Cxxx系列转换功能.
Variant在处理各种对象类型(包括类)时优于.NET的对象.如果您需要创建一个处理数据库的自定义表单,并且用户可以选择要用于该表单的表,您可能会发现它很有用.使用Variant可以更轻松地处理不同表的字段属于不同类型的事实.
Visual Basic 6可用于制作多层应用程序.表单可以实现类可以的接口.
请记住,在编译和编辑表单时会运行ActiveX控件.如果您不了解它,可能会引起各种陌生感.如果您有自己的ActiveX控件,这尤其成问题.