在.NET里使用Visual FoxPro资源-Visual FoxPro OLE DB Provider2007-05-08第一部分:Visual FoxPro OLE DB Provider说起 Fox,第一个印象就是DBF 数据表格,将近20年的发展历程,不知道有多少系统使用DBF存放数据。转入 .NET 平台以后,怎样访问 Fox系列数据自然是很多开发人员关心的问题。在 Visual FoxPro 7以前,微软只提供了Fox的ODBC的驱动程序。通过ODBC访问Fox数据效率比较低,更要命的是Visual FoxPro 3中增加的数据库容器(Database Container,简称DBC)中的许多特性都不被支持,这些特性包括存储过程、触发器、默认值、约束、参照完整性等。为了迎合.NET时代的到来,微软在Visual FoxPro 7 发布时一同推出了Visual FoxPro OLE DB Provider程序,它具有以下特性:(注意:目前微软只在Visual FoxPro 7专业版里提供此程序!)
- 数据访问更有效率
- 支持访问DBC里的存储过程
- 支持Visual FoxPro 7的新特性数据库事件(Database Container Events)
- 支持DBC里的触发器、默认值、约束、参照完整性
有了OLE DB Provider,我们就可以使用ADO.NET的 System.Data.OleDb 来访问Fox数据。介绍ADO.NET的资料很多,我们不必累述,这里只介绍三个比较特别问题:
- 设定数据工作期(Data Session)环境,例如对NULL值的处理模式、时间值的处理模式、字符串比较模式等
- 调用无返回值的存储过程
- 调用有返回值的存储过程
设定数据工作期(Data Session)环境用过Fox的朋友都知道,应用程序的起始部位都会使用一大堆SET 语句设定默认数据工作期的工作环境;延伸到ADO.NET,我们希望设定“连接”通道的工作环境,这就需要发送有关SET语句。需要传送命令,在ADO.NET里可以调用Command对象ExecuteNonQuery()方法。(CODE #1)//C#代码 设定数据工作期环境
OleDbConnection oConn=new OleDbConnection("Provider=vfpoledb.1;Data Source=c:\data\testdata.dbc;Exclusive=1");
oConn.Open();
OleDbCommand oCommand=new OleDbCommand();
oCommand.Connection=oConn;
oCommand.CommandText="SET EXACT ON
SET DELETED ON
SET Null OFF";
oCommand.ExecuteNonQuery();调用无返回值的存储过程Visual FoxPro 3引入了DBC的概念,从技术上使得DBF系列的数据表格上升到数据库的高度,支持数据库的典型特征,包括存储过程。这里所谓的存储过程用Fox的眼光看就是存放在DBC里面的函数或过程,与普通的Fox代码没有什么区别。需要注意的是,Visual FoxPro 7所提供的 OLE DB Provider 不支持规范的存储过程调用方式。更明确的说,不能使用类似调用SQL Server 中存储过程的方式调用DBC的存储过程。例如,在DBC里有这样的存储过程:(CODE #2)*DBC 里的一个存储过程,作用是写入一行记录到LOG表中
PROCEDURE LogMsg(cMsg as String)
INSERT INTO LOG(eventime,logmsg) values(DATETIME(),m.cMsg)
ENDPROC这是一个无返回值的过程,调用它的过程类似发送语句到数据库,于是具体处理是这样的:(CODE #3)//C#代码 调用无返回值的存储过程
string cMsg=”写入一行日志”;
oCommand.CommandText="LogMsg(‘"+cMsg+”’)”;
oCommand.ExecuteNonQuery();调用有返回值的存储过程在DBC有这样一个存储过程:(CODE #4)
*DBC里的一个存储过程,作用是合计指定国家的销售净额
FUNCTION Get_Sum_Order_Net(cCountry as String) as Currency
LOCAL iSum as Currency
SELECT sum(order_net) as order_net from orders WHERE cust_id in(SELECT cust_id from customer WHERE Country=m.cCountry) INTO CURSOR temp
iSum=temp.order_net
USE IN temp
RETURN iSum
ENDFUNC我们记得在ADO.NET的Command对象里有一个用于返回单个值的方法ExecuteScalar(),具体如下:(CODE #5)//C#代码 调用有返回值的存储过程
string lcCommand=” Get_Sum_Order_Net(‘UK’)”;
OleDbCommand oCommand=new OleDbCommand(lcCommand,oConn);
Object oResult=oCommand.ExecuteScalar();Fox是最快的桌面数据库,很多年来微软把主要的精力放在了Fox自身的变革上,忽视对外的访问接口(DBF表格结构简单,不少系统都能够直接访问)。现在,为了.NET中能够访问Fox系列数据源,微软发布了 OLE DB Provider,满足日常开发工作的需要。我们也看到,这个版本的程序在处理时与标准ADO.NET的做法有所不同,还好微软已经明确表示,将升级Visual FoxPro OLE DB Provider,使它能为.NET提供更完美支持!