前言
笔者是一名使用 Visual FoxPro 开发近二十年的程序员,使用过从VFP5~VFP9 的所有版本,用她写过不多不少、大大小小、好好烂烂的程序。虽天资愚钝,对程序设计却满腔热血。一路有过拼搏,有过迷茫,有过软件项目交付成功的成就和喜悦,有过项目烂尾的无奈......
第一次听到 X#,是前几年从 xinjie 老师那听来的,说 X# 是一门 .net 框架里的语言,他在梅子论坛载了几篇文章,可走马观花的看了一遍,感觉还要学 .net 的很多知识且 FoxPro 方言实现的太少,加之自己的开发框架及技术体系基本能应对目前的开发需求,就忽略过了。其实对 .net,我很久就想转过去的,买过好几本经典书,就是wrox那种红皮由清华大学出版的,VB.net,C#,ASP.NET 等,每本厚度都在一千页以上,可惜都束之高阁去吃灰了。.net 框架体系确实强大,无所不能,然而可能正是因这过于浩繁的内容,让我半途而废了!
前段加入了 xinjie 老师的群,在老师的带领下,大家都跃跃欲试,我也看到了 X# 最新版本的发展,尤其是对 Foxpro 方言的越来越高的兼容度,我想:是时候该尝试一下了。我想,X# 对于想我这一批老 Foxer 来说,是极具意义的,从几个方面:
当然,任何过程都不会是一帆风顺的。在学习X#过程中,我感到最大的难度或应用阻碍在几方面:
下面,我将使用X#开发一个Windows Form应用,实现一个最基本的从SQL服务器查询数据并显示在grid中的小例子。例子很简单,只希望管中窥豹,抛砖引玉,共同学习!
我的开发环境
开发环境的搭建,这里不会谈论,如果需要,可以参看其他资料或 xinjie 公众号文章。
新建项目
点击顶部菜单,文件--新建--项目,弹出下列窗口,按图示一步步完成项目创建。
不出意外的话,你会看到下图:
是不是有些熟悉?对,跟在 VFP 里新建的表单差不多,只是 form 的图标不是狐狸头而是 .net 图标,还记得之前说过的吗?X#是一门.Net语言!
项目设置
为了能让示例顺利运行,我们还需要对项目进行一些设置。
X# 项目必须引入基础程序集 DLL:XSharp.Core.DLL、XSharp.RT.DLL、及访问 SQL 所需的 XSharp.Data.DLL、及 Foxpro 方言需要的 XSharp.VFP.DLL,这就类似 VFP 里的 Set Liberay To 设置,照如下图示添加这些引用:
点”添加“后,再点确定,注意看到”解决方案资源管理器“的 References 下,出来刚选的 4 项就可以了。
form设计及代码
回到 form 设计界面,我们往 form 中拖入一个 DataGridView 组件用于记录表格显示。
然后点击 form 空白处,右边切换到“属性”窗口,选择“事件”,找到“FormClosed”,这是“关闭窗体”事件,类似 VFP 的 Form.Unload,我们要在这个事件方法里做一些事情,双击右边的框,就会自动产生事件方法”Form1_FormClosed",并自动打开代码窗口:
我们键入或复制以下代码到合适的位置:
USING System
USING System.Collections.Generic
USING System.ComponentModel
USING System.Data
USING System.Drawing
USING System.Linq
USING System.Text
USING System.Threading.Tasks
USING System.Windows.Forms
BEGIN NAMESPACE gridSample
PUBLIC PARTIAL CLASS Form1 ;
INHERIT System.Windows.Forms.Form
//自定义属性:保存连接句柄
PROTECTED nHandle AS INT
PUBLIC CONSTRUCTOR() STRICT//Form1构造方法
InitializeComponent()
// 连接数据库, 注意下面SqlStringConnect里需要改为你自己的sql服务器及数据库信息
THIS.nHandle=SqlStringConnect("Driver={SQL Server};Server=(local);Database=你的数据库;uid=sa;pwd=123456;", FALSE)
IF THIS.nHandle<1
Messagebox("连接数据库失败")
RETURN
ENDIF
// 执行sql查询, 注意下面的select语句需要改为你自己的,这里仅演示
SqlExec(THIS.nHandle,"Select id,name FROM 你的表", "cur")
// 数据源对象
LOCAL loDs AS DbDataSource
loDs = DbDataSource() //创建一个附加到当前工作区的DbDataSource对象
loDs.ShowDeleted = .F. //不显示”删除标记“虚拟列
loDs.ShowRecno = .F. //不显示”记录号“虚拟列
// 给dataGridView绑定数据源
THIS.dataGridView1.AutoGenerateColumns=.T. //按数据源的字段,自动生成表格列
THIS.dataGridView1.DataSource=loDs //数据源
END CONSTRUCTOR
PRIVATE METHOD Form1_FormClosed(sender AS System.Object, e AS System.Windows.Forms.FormClosedEventArgs) AS VOID STRICT
**关闭时,断开连接句柄
IF THIS.nHandle>0
SqlDisconnect(THIS.nHandle)
ENDIF
END METHOD
END CLASS
END NAMESPACE
需要注意的是,SqlStringConnect 和 SqlExec 两处需要根据你自己的服务器和表名进行修改!
之后,点击工具栏的”启动“或按 F5 就可以试着运行项目,如果你看到类似下面界面,那么恭喜您!
我们再回头看这个 form1.prg 文件里的代码:
主要代码我写了注释,从功能上就是在窗体运行时,连接 SQL 数据库,并执行一个 SQL 查询,将集合记录显示在 gridView 组件里。窗体关闭时就断开 SQL 连接并结束程序运行。如果你是多年的 Foxer,除了最开始的 USING 和 NAMESPACE 等比较陌生外,CONSTRUCTOR 方法体里的代码应该是比较熟悉的!它部分代码简直跟 VFP 代码一模一样,不是吗!这正是 X# 的“Foxpro"方言的意义,编译器认识各种 XBASE 系方言,它可将这些”方言“统一编译为可执行代码运行,“方言“的引入最大化兼容你使用的老语言的命令和函数等习惯,减少你学习 X# 和项目迁移成本!
那些陌生的命令是什么?
记住,X# 是一门 .net 语言,那些是 X# 语言本身的命令及语言特性!如需要深入了解,你可以看看 XSharp 自带的帮助文件,敲个F1看到了吗?
还有疑问?
我敲 F5 或点“启动”运行了项目,出现了运行窗体!可程序是从哪里启动执行的呢?
VFP 里每个项目都要指定一个“主”文件,也就是项目管理器里显示粗体的那个文件(main file),例如我一般命名为 main.prg。项目连编为 exe 运行时,就从主程序开始执行,里面开头一般都 SET 环境,设置搜寻PATH,设置类库过程文件,之后运行你的功能!
你能想到这点,很好!找到“解决方案资源管理器”项目文件里的Program.prg,你会找到答案的,双击打开它:
USING System
USING System.Collections.Generic
USING System.Linq
USING System.Text
USING System.Windows.Forms
USING gridSample
[STAThread] ;
FUNCTION Start() AS VOID
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault( FALSE )
Application.Run( Form1{} )
RETURN
对!这就是项目开始运行的程序,Start()函数是入口方法,可以看到,在 Start 里创建 Form1 窗体类的实例并打开了。这个 Start 函数是必须存在的,不能修改为其他函数名,否则编译出错。
结语
通过这个简单的例子,相信您对在 X# 里使用 Foxpro 方言开发一个项目已有所了解。让你明白,有些内容对你来说是熟悉而亲切的,或许有一天你会投入他的怀抱。
可以看到,随着 X# 的日臻完善,对 Foxpro 方言的兼容性越强,这对于 Foxer 来说,是一个好的福音。得益于 .net 庞大而丰富的生态,再有 Foxpro 天然的数据处理的优势,使得 foxer 可能实现之前无法或很难实现的功能,开辟新的开发领域,如B/S,网络交互等。
当然,本文的示例是一个最简单的数据浏览的项目,对于实际项目中数据处理的更多需求,如检索,新增、修改、删除等,还有待我们进一步学习和研究。