电脑教程中文网
首页  动态网站建设学习 程序  笑话  论坛 娱乐  交友 ADSL  峄城  成功者
中文名:电脑教程中文网,收集了大量的电脑教程! 编程技术文档 游戏开发 笑话站暂时关闭 设为首页
网页设计 HTML | Dreamweaver | CSS | Firework | FrontPage WEB开发 ASP | JSP | PHP | .NET | CGI | JS | VBS | XML | IIS6 | Apache | PWS
程序设计 Java | C++ |VC++ | C# | Delphi | VB | C语言 | 汇编 | Pascal | Perl 数据库 MSSQL | MySQL | Access | VF | Oracle | DB2 | SYBASE |
办公软件 Word | Excel | WPS | PowerPoint 动画平面 Photoshop | ACDSee | 3Dmax | Flash | Coreldraw |
操作系统 Windows 2000 | Windows XP | Windows 2003 | SCO Unix | Windows Vista | unix、Linux | 综合| 服务器 | 系统安全| 黑客技术
其  他 UltraDev | DOS | UML | PWS | Powerbuilder | 开发心得 | 设计理念 | 病毒库 | 其他 | LightTPD (分类排序给您带来不便请谅解)
推  荐: Java文档500篇》《ASP.NET与相关数据库技术高级指南》《TC图形函数详解》《C函数速查手册》《C语言编程宝典之一》《MFC深入浅出》《黑客零起点》《VC++ 编程指南》《JScript 用户指南》 《CSS教程宝典》《Microsoft Jet SQL 参考》《delphi技巧集合》《MySQL 4.1.0 中文参考手册》《MySQL中文手册
【导航】 您现在的位置 : 首页 - 数据库教程 - 《数据库综合技术文档0803期》- 以优雅的方式在sqlite数据库中创建自定义SQL函数

以优雅的方式在sqlite数据库中创建自定义SQL函数

日期:2008-3-16 20:42:07 作者:“易语言.飞扬”开发组 人气:     来源:网络




这里说的SQL函数,是指可在SQL语句中使用的函数,如常见的 count(), sum(), avg(), min(), max() 等。

在 sqlite 数据库中,SQL函数被分为两大类,一类称作“Scalar function”,一类称作“Aggregate function”。Scalar 和 Aggregate 实在不太清楚该怎么翻译,而其含义,也难于用言语表达,大概属于只可意会不可言传的情况。通俗来说,Scalar函数基本等同于C/C++函数,而上面提到的 count(), sum() 等函数则属于Aggregate函数。Aggregate函数不是根据参数直接得出结果,而是综合了符合条件的所有记录才最终计算出结果。

在 sqlite 中创建自定义SQL函数,需涉及以下接口函数:

int sqlite3_create_function(
sqlite3 *db,
const char *zFunctionName,
int nArg,
int eTextRep,
void *pApp,
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*)
);

void *sqlite3_user_data(sqlite3_context*);

void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);

const void *sqlite3_value_blob(sqlite3_value*);
int sqlite3_value_bytes(sqlite3_value*);
int sqlite3_value_bytes16(sqlite3_value*);
double sqlite3_value_double(sqlite3_value*);
int sqlite3_value_int(sqlite3_value*);
sqlite3_int64 sqlite3_value_int64(sqlite3_value*);
const unsigned char *sqlite3_value_text(sqlite3_value*);
const void *sqlite3_value_text16(sqlite3_value*);
const void *sqlite3_value_text16le(sqlite3_value*);
const void *sqlite3_value_text16be(sqlite3_value*);
int sqlite3_value_type(sqlite3_value*);
int sqlite3_value_numeric_type(sqlite3_value*);

void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
void sqlite3_result_double(sqlite3_context*, double);
void sqlite3_result_error(sqlite3_context*, const char*, int);
void sqlite3_result_error16(sqlite3_context*, const void*, int);
void sqlite3_result_error_toobig(sqlite3_context*);
void sqlite3_result_error_nomem(sqlite3_context*);
void sqlite3_result_error_code(sqlite3_context*, int);
void sqlite3_result_int(sqlite3_context*, int);
void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);
void sqlite3_result_null(sqlite3_context*);
void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));
void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
void sqlite3_result_zeroblob(sqlite3_context*, int n);

要编写sqlite3_create_function()所需的三个函数xFunc(), xStep(), xFinal(),不得不使用上面一堆接口函数,比较复杂的说。如果仅仅是单纯的将以上函数一一对应到EF中,无疑是把复杂的工作转稼给用户,意义不大。(值得一提的是,在易语言的sqlite支持库中,因为没有找到比较优雅的解决方案,未提供创建自定义SQL函数的功能。) 通过对sqlite api进行包装和再加工,我们在“易语言.飞扬”中提供了简洁易用的、面向对象的、优雅的操作接口,在很大程度上简化了创建自定义SQL函数的工作。

在“易语言.飞扬”中,要创建一个“Scalar function”,只需调用 SqliteDB.RegSQLScalarFunc(),传入一个实现了接口 SQLScalarFunction 的对象即可:

public interface SQLScalarFunction
{
public 文本 取函数名称();
public 整数 取参数个数();
public 通用型,整数 执行(通用型[] 参数);
}

用户的工作主要集中在接口方法“通用型,整数 执行(通用型[] 参数)”中(对应前面提到的xFunc),只需根据通用型数组参数计算出结果并返回即可。在这之前通过调用sqlite3_value_*系列函数获取SQL参数,以及在这之后调用sqlite3_result_*系列函数将结果反馈到sqlite的工作,全部由类库代劳。用户接口非常简洁。

在“易语言.飞扬”中,要创建一个“Aggregate function”,只需调用 SqliteDB.RegSQLAggregateFunc(),传入一个实现了接口 SQLAggregateFunction 的对象即可:

public interface SQLAggregateFunction
{
public 文本 取函数名称();
public 整数 取参数个数();
public SQLAggregateExecutor 创建执行者();
}

public interface SQLAggregateExecutor
{
public 通用型,整数 单步执行(通用型[] 参数);
public 通用型,整数 最终执行();
}

在一个Aggregate function被调用时,将自动调用“SQLAggregateFunction.创建执行者()”为该函数创建一个“执行者”对象(实现接口SQLAggregateExecutor)。为什么要创建“执行者”对象呢?因为Aggregate function是“上下文有关的”,每个函数调用都需要单独维护各自的上下文信息。接口SQLAggregateExecutor中的方法“单步执行”“最终执行”分别对应前面提到的xStep,xFinal,聪明的您也许已经猜测到了。

“易语言.飞扬”sqlite类库(sqlite.efn)提供的以上接口,简洁易用、通俗易懂、面向对象、优雅大方,完全摆脱了sqlite api 的影子,是对原有接口的精心再加工,充分体现了我们“将复杂的事情简单化”的决心。

( 注,以上涉及的类型名称和方法名称中英混用,也许是需要最终调整和完善的地方。)

根据以上接口,我们可以很轻松的实现自已版本的 sum() 函数——mysum():

public class MySum
{
public 文本 取函数名称() { 返回 "mysum"; }
public 整数 取参数个数() { 返回 1; }
public SQLAggregateExecutor 创建执行者() { 返回 new MySumExecutor(); }

class MySumExecutor
{
private int _sum = 0;
public 通用型,整数 单步执行(通用型[] 参数)
{
_sum += 参数[0];
}
public 通用型,整数 最终执行() { 返回 (_sum,0); }
}
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2186745


转自CLDE.NET


本文由CLDE.NET原创或整理(收集),如您需转载,请保留一下链接,谢谢!


下一篇:ASCII码对照表
※视频教程※
ASP入门到精通视频教程
西安电科大JSP视频教程
photoshop cs2视频教程
flash动画设计师视频教程
Dreamweaver视频教程
VB从入门到精通视频教程
 
 


网站首页 - 友情链接 - 公司简介 - 联系方式 - 广告投放 - 客户服务 - 错误报告 - 免责声明 - About us
CLDE.NET电脑教程中文网版权所有 未经许可禁止镜象和复制本站资料 MSN:CLDE_NET@hotmail.com
技术支持:CLDE.NET信息中心 鲁ICP备05039940号 友情链接QQ:784079(隐)